平台:使用 Eclipse IDE 的 Java SWT
在继续之前,我确实在 Stack Overflow 上看到了类似的问题,19035407 .
来源:
package prjMyapp;
import java.io.InputStream;
public class Myapp
{
public static void main(String[] args)
{
InputStream oStream = Myapp.class.getResourceAsStream("resources/StarTrekLandruRocks.txt");
if (null == oStream)
System.out.println("input stream is null");
else
System.out.println("input stream is NOT null :-)");
}
}
文档放置
prjMyApp / src / prjMyApp
--> All .java files
--> resources
--> Non-image resources
--> images
--> Image resources (jpg, png)
有趣的笔记
我曾经使用/prjMyapp/resources/whatever.txt 和/prjMyapp/images/whatever.ext,但是在测试解决这个问题的过程中,我意识到相对路径也可以工作并且在视觉上和其他方面都更好,因此“resources/StarTrekLandruRocks.txt”代替之前的“/prjMyapp/resources/StarTrekLandruRocks.txt”。如前所述,图像,我有很多,在所有机器(甚至是 Mac)上都能按预期工作,只是文本文件不行。
开发机:
无论我做什么,我的开发机器都能完美地执行代码。
CENTOS 盒子
我的 CENTOS (Linux) 框执行自包含的所有包含 jar 文件,为此我使用 ANT 创建文件。如果我将文本文件作为 png 扩展名,我可以加载文本文件,但我无法将文件作为 txt 扩展名加载,其他一切都一样。
是的,我知道永远不应该将 txt 文件重命名为 png 扩展名,但我很好奇会发生什么,因为我可以毫无问题地加载图像(jpg 和 png)。我发现 getSystemClassLoader 只是不喜欢 txt 扩展名。将扩展名重命名为 png 是一种 hack,并且无论出于何种原因都会伪造该方法。
我宁愿不做黑客。
为什么 getSystemClassLoader 不能直接使用 txt 扩展名?根据另一篇文章,它应该,但不在我的系统上。
修复是什么?
最佳答案
评论让我找到了答案。
getResourceAsStream() 方法有效。我只是没有意识到该文件根本不在 jar 中作为 txt 扩展名,因此失败。
<target name="jarResources" depends="jarCode">
<jar destfile="${jar.code}" update="true">
<fileset dir="${src.dir}" includes="**/*.png" />
<fileset dir="${src.dir}" includes="**/*.jpg" />
<fileset dir="${src.dir}" includes="**/*.ico" />
<fileset dir="${src.dir}" includes="**/*.txt" />
</jar>
</target>
我遗漏了 jarResources 部分的最后一行。它最初只有 png、jpg 和 ico。添加 txt 行解决了问题。
问题可能出在构建脚本中,而不仅仅是在 Java 中,吸取教训。谢谢。
关于java - getResourceAsStream 为 txt 文件返回 null 但对图像有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374444/