2015-12-19 101 views
0

我正在處理一個小項目,我需要將文件從應用程序JAR移動到JAR之外的另一個位置。關於ClassLoader.getResource()的NullPointerException異常

這是我的JAR文件看起來像:

MyApp.JAR 
    |- META-INF 
     |- MANIFEST.MF 
    |- files 
     |- myFile.exe 
    |- MainClass.class 

我希望做的是移動myFile.exeC:\\(例如)。 所以在MainClass我試着用:

23. Path path = Paths.get(getClass().getClassLoader().getResource("/files/myFile.exe").toURI()); 
24. byte[] bytes = Files.readAllBytes(path); 

25. FileOutputStream fos = new FileOutputStream("C:\\myFile.exe"); 
26. fos.write(b); 
27. fos.close(); 

運行我的應用程序後,我收到了NullPointerException,這裏是它的:

java.lang.NullPointerException 
    at MainClass.<init>(MainClass.java:23) 
    at MainClass.main(MainClass.java:66) 

(66號線是我打電話與new MainClass();構造函數)

我知道NPE可能是因爲myFile.exe找不到,但我不明白爲什麼... 當我打開JAR時,我可以看到files文件夾內有exe。 也許我是以錯誤的方式訪問文件? 我嘗試了許多其他方式,我在StackOverflow上找到這裏,但沒有任何作品...

在此先感謝和抱歉我的英語。

+0

也許你可以線23分成多個作業線由行,這樣,這將是可見的什麼返回'null'? – RAnders00

+0

正確的路徑是'files/myFile.exe',不帶前導斜槓。但是你應該從getClass()返回的InputStream中讀取字節getClassLoader()。getResourceAsStream(「files/myFile.exe」)' –

回答

0

我想在這裏你要採取太多的中間笨重的步驟,因爲標準的Java API不允許你立即執行。我建議你使用IOUtils.copy過度複製字節:

try(InputStream resourceStream = getClass().getResourceAsStream("/files/myFile.exe"); 
    FileOutputStream fos = new FileOutputStream("C:\\myFile.exe")) 
{ 
    IOUtils.copy(resourceStream, fos); 
} // optionally, catch IOException here (or declare it to be thrown) 

如果您需要提供給getResourceAsStream()的URL援助,期待here

0

您正在使用絕對路徑:你應該用("files/myFiles.exe") ISO ("/files/myFiles.exe")