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

标签 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 盒子

我的 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/

相关文章:

java - 具有方法名称和与外部类不同的签名的内部类

php - MySQL混表查询

java - 从 Java 调用 C++,但 Java 加载了错误的 Glibc 版本

java - 哪个库更适合更快的 Java 应用程序 swt 或 swing?

java - 我在哪里可以下载 swt 的 javadoc(仅限)

java - 确定细胞分离器

java - 具有多重性的 EByteArray 或 EFloat 的 Ecore defaultValue

java - Eclipse - 无法在 64 位 JVM 上加载 32 位 SWT 库

java - 如何在 MinGw shell 中使用 %JAVA_HOME% 环境变量

regex - 使用 sed 提取特定单词