getResourceAsStream为txt文件返回null,但对图像有效

时间:2014-06-23 20:06:48

标签: java linux swt inputstream

平台:使用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 Box

我的CENTOS(Linux)框执行自包含的全包jar文件,为此我使用ANT创建文件。我可以加载文本文件,如果我将文本文件作为png扩展名,但是我无法将文件作为txt扩展名加载,与其他所有内容一样。

是的,我知道将txt文件重命名为png扩展名应该永远不会完成,但我很好奇会发生什么,因为我可以加载图像(jpg和png)而没有任何问题。我发现getSystemClassLoader只是不喜欢txt扩展名。将扩展名重命名为png是一种破解,并且无论出于何种原因都将该方法伪造成工作。

我宁愿不做黑客攻击。

为什么getSystemClassLoader不能直接使用txt扩展名?根据另一篇文章它应该,但不是我的系统。

修复是什么?

1 个答案:

答案 0 :(得分:1)

这些评论让我得到答案。

方法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中,经验教训。感谢。