0

在我的 java 程序中,我有一个名为 resources 的包,我在其中保留了一个 log.ascii 文件,我在其中保存了一些详细信息。为此,我使用了该方法

.class.getResource("/resources")当我在 Eclipse 上测试它时一切正常,但是当我构建 jar 时它找不到路径。你知道如何克服这个问题吗?感谢您的时间

    private static String retrieveSelectedWorkspace() throws FileNotFoundException{

    String temp[];      
    String str=Gui.class.getResource("/resources").toString();

    temp=str.split("/",2);

    FileReader fr = null;
        fr = new FileReader(temp[1]+"/log.ascii");

    Scanner scanner = new Scanner(fr);

    while(scanner.hasNextLine())            
        return scanner.nextLine().toString();

    return null;
}
}
4

4 回答 4

1

getResource返回一个URL. 不要toString用它做一些丑陋的字符串连接。构建 JAR 后,URL 不是文件系统 URL。在 Eclipse 中开发并从那里运行时,您仍然有可以使用的文件。

当然,您不能写入 JAR 中的资源。

于 2013-03-31T21:56:13.900 回答
1

我认为您的代码可以改用Class.getResourceAsStream()/resources/log.ascii需要打包在 jar 中或类路径上的其他位置)。

private static String retrieveSelectedWorkspace() throws FileNotFoundException {
    InputStream in = Gui.class.getResourceAsStream("/resources/log.ascii");
    Scanner scanner = new Scanner(in);
    while(scanner.hasNextLine())            
        return scanner.nextLine().toString();
    return null;
}

但是对于您的实际问题,您绝对可以从 jar 中获取文件夹资源,只要该文件夹包含在 jar 中即可。

测试.java:

class Test {
    public static void main(String[] args) {
        System.out.println(Test.class.getResource("/text.txt"));
        System.out.println(Test.class.getResource("/folder"));
    }
}

命令行。创建一个文件和一个文件夹。然后尝试从.class文件运行代码和从文件运行代码.jar

C:\Temp>echo text > text.txt

C:\Temp>md folder

C:\Temp>javac Test.java

C:\Temp>java Test
file:/C:/Temp/text.txt
file:/C:/Temp/folder

创建罐子:

C:\Temp>jar cvf test.jar Test.class text.txt folder
added manifest
adding: Test.class(in = 530) (out= 347)(deflated 34%)
adding: text.txt(in = 7) (out= 9)(deflated -28%)
adding: folder/(in = 0) (out= 0)(stored 0%)

从罐子里运行:

C:\Temp>java -classpath test.jar Test
jar:file:/C:/Temp/test.jar!/text.txt
jar:file:/C:/Temp/test.jar!/folder
于 2013-03-31T22:01:16.630 回答
0

尝试

getClass().getClassLoader().getResource("/resources")))

您也可以在一行中完成整个操作:

new Scanner(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("/resources/log.ascii"))).useDelimiter("\\A").next()
于 2013-03-31T21:55:42.880 回答
0

当您在 Eclipse 上运行时,log.ascii 是文件系统上的一个文件,但是当您打包到一个 jar 中时,log.ascii 是一个类似 zip 文件的条目。这就是为什么你没有完成它。

您可以创建一个临时文件或在系统属性java.io.tmpdir指定的临时目录上创建文件以使其工作。

于 2013-03-31T22:00:44.023 回答