JavaEE - WAR - 已部署::如何从资源目录中读取文件[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaEE - WAR - 已部署::如何从资源目录中读取文件[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我认为应该这样做的“正确”方式是getResourceAsStream()
,但它似乎并没有削减它。
我的情况:
我有一个Java的Web应用程序,最终将部署到几个不同的Web服务器,可能是GlassFish,Tomcat和WildFly。目前我正在使用Netbeans处理Mac,我可以访问WildFly和GlassFish。该项目已经成熟
我需要做的是读取和写入两个不同的Excel文件。一个用作“模板”,一个用作输出文件。该应用程序以前独立运行,我试图将其包装到JSF网站。
我需要为我的其中一个方法获取一个FileInputStream
,并最终创建一个输出文件,该文件将通过http提供给用户。
根据我的收集,适当的方式来做到这一点应该是:
XLSX文件
/src/main/resources/ANALYSIS_template.xlsx
位置一旦编译成WAR文件:: WildFly
/usr/local/opt/wildfly-as/libexec/standalone/deployments/fleetForecast-1.0-SNAPSHOT.war/WEB-INF/classes/ANALYSIS_template.xlsx
位置一旦编译成WAR文件:: GlassFish
~/devel/fleetforecast/target/fleetForecast-1.0-SNAPSHOT/WEB-INF/classes/ANALYSIS_template.xlsx
Java代码
我想我可能设法使用以下命令获取文件的输入流:
InputStream is1 = getClass().getResourceAsStream("ANALYSIS_template.xlsx");
我也尝试过类似行为的("/ANALYSIS_template.xlsx")
。当我尝试从此输入流中读取时
try {
is1.read();
} catch (IOException ex) {
Logger.getLogger(FleetBean.class.getName()).log(Level.SEVERE, null, ex);
}
我得到了一个java.lang.NullPointerException
。
Caused by: java.lang.NullPointerException
at org.mitre.fleetforecast.bean.FleetBean.<init>(FleetBean.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at java.lang.Class.newInstance(Class.java:433)
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186)
... 76 more
任何提供或想到的援助将不胜感激。
最后看起来这就是执行这个技巧的代码。我不明白为什么,但显然它有效,我不抱怨。
InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream("/ANALYSIS_template.xlsx");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
我从头开始创建了一个新项目,这段代码很有效。谢谢你的帮助!
这样的事情怎么样:
InputStream is1 = URLClassLoader.getSystemResourceAsStream("/classes/ANALYSIS_template.xlsx");
要么
InputStream is1 = this.getClass().getResourceAsStream("/classes/ANALYSIS_template.xlsx"));
编辑:
从servlet容器访问文件时使用此选项
InputStream is1 = ServletContext.getResourceAsStream("/WEB-INF/classes/ANALYSIS_template.xlsx") ;
如果你想获得java File对象,可以试试这个:
String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath();
File f = new File(path);
System.out.println(f.getAbsolutePath());
这可能是文件相对路径与文件绝对路径的问题吗?你可以尝试使用FileInputStream并使用绝对路径吗?如果这样可行,那么你可能只需要修改相对路径?
以上是关于JavaEE - WAR - 已部署::如何从资源目录中读取文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章
看到 myproject.war.undeployed 无法在已部署的 .war 中部署