2010-06-19 65 views
3

我試圖在我的runnable .jar文件中包含大量文本文件作爲資源。下面的代碼應打印一個文件的內容:無法爲Jar中的文件創建File對象

URI resourceFile = Driver.class.getResource("/etc/inputfile.txt").toURI(); 
System.out.println("Opening URI: " + resourceFile.toString()); 
File infile = new File(resourceFile); 

Scanner sc = new Scanner(infile); 
while (sc.hasNextLine()) 
    System.out.println(sc.nextLine()); 
sc.close(); 

導出爲一個可運行罐子後,我得到了運行時輸出如下:

開幕URI:RSRC:ETC/inputfile.txt
java.lang.IllegalArgumentException異常:URI是不分層 在java.io.File的(File.java:363)

該文件可以沒有任何問題地打印,如果我使用getResourceA。 sStream,但我想用其他原因使用File對象。
我該如何解決這個問題?

感謝,
馬丁

+1

Dupe of http://stackoverflow.com/questions/676097/java-resource-as-file或http://stackoverflow.com/questions/403256/how-do-i-read-a-resource-file -from-a-java-jar-file – 2010-06-19 22:26:28

+0

https://stackoverflow.com/questions/46135427/uri-not-hierarchical-need-to-use-file-class-for-a-method/46135584?noredirect=1 #comment79233689_46135584可能會有所幫助。我有類似的問題。 – shadowforce100 2017-09-09 23:21:52

回答

4

一個URI代表 「文件」,只有當方案是file:。 而構造函數File(URI)在這一點上是明確的。 你不能把一個罐子內壓縮文件的文件,因爲...它只是是不是Java就認爲File什麼:閱讀的what the File class represents定義:

文件和 的抽象表示目錄路徑名稱爲

如您所說,讀取的方法是getResourceAsStream()

+0

好的,謝謝。你知道任何有助於抽象的開源框架,所以我可以將文件和jar流視爲一樣嗎? – 2010-06-19 22:22:14

+2

我爲此使用了'URL'(或URI)。它可以被視爲一種泛化,作爲特殊情況包括文件(方案'file:')和罐內資源(方案'jar:')。但請記住:一個Java'File'在概念上就是路徑,可以把它看作文件的名字。它是資源的標識符(不一定打開,甚至可能不存在)。不要將該概念與文件內容混合使用。流是內容。 – leonbloy 2010-06-19 22:29:41

1

你不能。 java.io.File是對文件系統上路徑和路徑名的抽象。如果您想在JAR中引用文件,您需要將其保存在URL域中。