2014-10-31 86 views
7
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL url = classLoader.getResource("com/x/y/z.cfg"); 
File file = new File(url.getPath()); 

這適用於從Eclipse運行jar文件但在jar文件中運行時不起作用。classLoader.getResource在jar文件中不起作用

java.io.FileNotFoundException:文件:\ C:\用戶\新星\桌面\ Matcher.jar \ C OM \ X \ Y \ z.cfg

這不是一個副本。我檢查了所有其他問題,沒有有用的信息。

+1

一旦你得到它,你想用這個'File'來做什麼?你不能從你在JAR中獲取資源的URL中創建一個'File'(因爲它不是'file:'URL,通常是'jar:file:/path/to/file.jar!/ com/x/y/z.cfg'),但是如果你使用的API可以接受一個'URL'或'InputStream'而不是'File',那麼你就不需要。 – 2014-10-31 12:55:01

+6

這是多次解釋:[here](http://stackoverflow.com/questions/944610/how-do-i-access-a-config-file-inside-the-jar),[here](http: //stackoverflow.com/questions/20389255/java-reading-a-resource-file-from-within-jar),[here](http://stackoverflow.com/questions/403256/how-do-read -a-資源文件從-A-java的罐子文件?RQ = 1)。這個共振真的是因爲File代表一個文件系統對象,並且jar的內容不能被文件系統訪問(但是Java可以以某種方式處理它 - 作爲InputStream)。 – 2014-10-31 12:59:37

+0

URL.getFile()*不會將URL轉換爲有效的文件路徑。它僅僅返回URL的路徑部分。 (在Java 1.0的日子裏,大多數URL都會引用物理文件;這就是爲什麼該方法被命名爲getFile。) – VGR 2017-03-01 16:41:10

回答

11

當文件被捆綁在jar中時,它變成字節流而不是普通的File對象。

嘗試

InputStream stram=getClass().getClassLoader().getResourceAsStream(relativePath); 

More Tutorial...

閱讀類似的帖子herehere

1

不能創建一個File實例,因爲你擁有的唯一文件是JAR。這就是getResource()返回URL的原因。您可以使用URL.openStream()方法讀取內容。