[Class] .class.getResourceAsStream(...)在某些目录中的JAR文件中使用时返回null?

时间:2013-08-31 14:29:25

标签: java eclipse jar resources

我有一个非常奇怪的问题。似乎从JAR文件内部加载资源有时会起作用,有时则不起作用。

Jar文件只包含类文件,清单和test.txt

当我用Eclipse打包时,它通常运行良好(可以访问test.txt的内容)但在某些目录中,Resourceproblem.class.getResourceAsStream("/test.txt")返回null - 尽管它是相同的Jar文件!

例如,当我双击jar文件\\remotecomputer\folder\subfolder\test.jar时,无法找到jar文件中的test.txt。但有时(?)路径名称很长并且包含空格(至少在Windows XP SP3上)的情况也是如此。

有什么想法吗?

示例代码:

import java.io.*;

import javax.swing.*;

public class Resourceproblem {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Resourceproblem();
            }
        });
    }

    private Resourceproblem() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        JTextArea text = new JTextArea();
        text.setEditable(false);
        frame.add(text);
        frame.setVisible(true);

        try {
            InputStream in = Resourceproblem.class.getResourceAsStream("/test.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line = br.readLine();
            br.close();
            in.close();
            text.setText(line);
        } catch(Exception ex) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            ex.printStackTrace(pw);
            pw.flush();
            String s = sw.toString();
            pw.close();
            ex.printStackTrace();
            text.setText(s);
        }
    }
}

test.txt只是一个文本文件,其中有一行用于检查加载是否成功。

1 个答案:

答案 0 :(得分:0)

我有一个想法,但我不相信我知道你的问题是什么。

我使用eclipse多次从你的示例源创建一个jar文件;我使用Win7将jar文件存储在c:\ local和c:\ local \ one \ two三\四中。

我不熟悉在getResourceAsStream()调用中在资源文件名前面使用“/”。您的示例程序在每种情况下都可以使用或不使用“/”,但我建议将其删除,看看是否能解决您的问题。在这种情况下,该文件与访问它的类位于同一目录中。

我原以为“/”会导致程序在文件系统的根目录下查找文件,但这似乎不会发生......