2

我有一个非常奇怪的问题。似乎从 JAR 文件中加载资源有时有效,有时无效。

Jar 文件仅包含类文件、清单和test.txt.

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

例如,当我双击 jar 文件时\\remotecomputer\folder\subfolder\test.jartest.txt找不到里面的 jar 文件。但有时(?)路径名很长并且包含空格(至少在 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 只是一个文本文件,其中有一行用于检查加载是否成功。

4

1 回答 1

0

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

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

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

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

于 2013-08-31T15:06:45.160 回答