JavaEE - WAR - 已部署 :: 如何从资源目录中读取文件 [重复]

Posted

技术标签:

【中文标题】JavaEE - WAR - 已部署 :: 如何从资源目录中读取文件 [重复]【英文标题】:JavaEE - WAR - Deployed :: How to read a file from resource directory [duplicate] 【发布时间】:2014-07-11 21:28:40 【问题描述】:

我相信应该这样做的“正确”方式是getResourceAsStream(),但它似乎并没有削减它。

我的情况:

我有一个 Java 网络应用程序,最终将部署到几个不同的网络服务器上,可能有 GlassFishTomcatWildFly >。目前我正在使用 Netbeans 在 Mac 上工作,并且可以访问 WildFlyGlassFish。项目mavenized

我需要做的是读写两个不同的 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

我们将不胜感激提供或想到的任何帮助。

【问题讨论】:

您绝对不想使用绝对路径或包含/usr/localsrc/main 之类的路径...查看this。 我的 java 代码没有使用绝对路径 -> 我只是指出它们在文件系统上的位置 【参考方案1】:

最后看起来这就是成功的代码。我不知道为什么,但显然它奏效了,我没有抱怨。

InputStream inputStream = getClass().getClassLoader()
                         .getResourceAsStream("/ANALYSIS_template.xlsx");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

我从头开始制作了一个新项目表单,并且此代码有效。谢谢大家的帮助!

【讨论】:

【参考方案2】:

这样的事情怎么样:

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") ;

【讨论】:

抱歉,这些似乎都不起作用 谢谢,但我还是卡住了。也许是午饭后的神圣灵感。您所建议的一切都是互联网所说的正确方法。我想知道是否还有其他粗略的事情发生...... 这很有帮助,但最终它不是正确的代码。我仍然投票支持你寻求帮助 感谢您的投票。【参考方案3】:

如果你想获取java File对象,你可以试试这个:

String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath();
File f = new File(path);
System.out.println(f.getAbsolutePath());

【讨论】:

【参考方案4】:

这可能是文件的相对路径与文件的绝对路径的问题吗? 您可以尝试使用 FileInputStream 并使用绝对路径吗?如果可行,那么您可能只需要修改相对路径?

【讨论】:

这是个好主意。我明天早上试试。

以上是关于JavaEE - WAR - 已部署 :: 如何从资源目录中读取文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

看到 myproject.war.undeployed 无法在已部署的 .war 中部署

JavaEE + JBoss:验证所有部署的war文件

如何部署war包到tomcat

linux下部署一个JavaEE项目的简单步骤

知识小罐头03(javaee初学者用maven+部署war包到tomcat 上)

Java+Tomcat:使用已部署的 WAR 文件继续开发(手头没有源代码)