获取jar的内包装的路径

时间:2013-03-31 21:41:58

标签: java

在我的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 个答案:

答案 0 :(得分:1)

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

当然,您无法写入JAR中的资源。

答案 1 :(得分: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中。

Test.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

创建jar:

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%)

从jar中运行:

C:\Temp>java -classpath test.jar Test
jar:file:/C:/Temp/test.jar!/text.txt
jar:file:/C:/Temp/test.jar!/folder

答案 2 :(得分:0)

尝试

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

您也可以在一行中完成整个事情:

new Scanner(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("/resources/log.ascii"))).useDelimiter("\\A").next()

答案 3 :(得分:0)

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

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