2013-03-31 108 views
0

在我的Java程序中,我有一個包叫做資源,有我預留log.ascii文件,其中我節省一些details.To的內包的路徑做,所以我使用的方法獲得一個罐子

.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; 
} 
} 
+0

你是什麼意思 「當我建立罐子它找到路徑」? –

+0

請發佈您的代碼。 – Aubin

+0

遺憾錯過了「不會」 – Libathos

回答

1

我認爲你的代碼可以使用Class.getResourceAsStream()代替(/resources/log.ascii需要打包在jar中,或者在classpath的其他地方)。

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; 
} 

但是作爲你的實際問題,你絕對可以抓住從一個罐子裏的文件夾資源,只要該文件夾的包裝罐內。

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

運行從罐子:

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

嘗試

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

你也可以做整個事情在同一行:

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

getResource返回URL。不要toString它,並與它做一些醜陋的字符串連接。在構建JAR之後,該URL不是文件系統URL。在Eclipse中開發並從那裏運行時,您仍然有文件在這裏工作。

當然,你不能寫在一個JAR的資源。

+0

哦,所以這是不可能寫入到罐子的資源?謝謝我不知道它 – Libathos

+0

可以。但不像你正在寫共同文件。 – DiogoSantana

+0

你_normally_離不開技巧和你_永遠_應(除非你正在建設一個Java編譯器和打包)。在運行時你甚至都不知道JAR是如何服務的,所以在某些情況下這些技巧將不起作用(嘗試寫入從HTTP服務器提供的JAR)。使用JAR作爲用戶文件的容器將非常罕見。 –

0

當您在Eclipse中運行的log.ascii是文件系統中的文件,但是當你打包成一個瓶子,log.ascii就像是文件的zip內的條目。這就是爲什麼你沒有完成它。

您可以創建一個臨時文件或創建由系統屬性java.io.tmpdir指定的臨時目錄文件,使其工作。

+0

好吧,我不知道,謝謝你的時間 – Libathos