2014-06-26 166 views
1

我創建了一個名爲FileCopyFromJAR的類,該類具有名爲copy的靜態方法。這讓我使用的getResourceAsStream複製文件到JAR之外:從.jar文件複製文件夾

public static void copy(String source,String dest) throws IOException{ 
    try{ 
     File sourceFile = new File(source); 
     File destFile = new File(dest); 
     InputStream in = FileCopyFromJAR.class.getResourceAsStream(source); 
     OutputStream out = new FileOutputStream(destFile); 
     int bufferSize = 1024; 
     byte[] buf = new byte[bufferSize]; 
     int len; 
     while ((len = in.read(buf)) > 0){ 
      out.write(buf,0,len); 
     } 
     in.close(); 
     out.close(); 
    } 
    catch(IOException e){ 
     throw e; 
    } 
} 

裏面我的代碼,我會做這樣的事情把這個(假定test.txt的是我的.jar文件的根目錄) :

FileCopyFromJAR.copy("/test.txt","c:\\test.txt"); 

但是,如果我指定文件夾或文件夾內的文件,我會得到FileNotFoundException。這兩個返回錯誤:

FileCopyFromJAR.copy("folder\test.txt","c:\\test.txt"); 
FileCopyFromJAR.copy("folder", "c:\\folder"); 

我也試過使用各種組合/folder\test.txt等,但似乎沒有任何工作。有沒有辦法讓這項工作或我必須使用不同的方法?

+0

這是一個問題的重複,我只是把一個賞金,讓我試着找到它。 – djechlin

+0

@djechlin - 謝謝,那太棒了! – Trinculo

+0

[複製目錄從一個jar文件]可能的副本(http://stackoverflow.com/questions/1386809/copy-directory-from-a-jar-file) – djechlin

回答

2

我想通了!我打破了我的「核心Java卷1」第9版的書,它說:「請注意,無論系統中實際存儲資源文件的目錄分隔符如何,您都必須始終使用/分隔符。」 (Horstmann,第571頁,第10.1章JAR文件)。

所以此工程:

FileCopyFromJAR.copy("/folder/test.txt", "c:\\test12.txt"); 

希望這有助於人在那裏!這讓我瘋狂!

0

按照class.getResourceAsStream documentation:「與給定類相關的資源搜索的規則是由類的定義class loader實現。」

然後裝載機類有:

作爲String參數提供給ClassLoader中的方法的任何類名必須是Java Language Specification定義的二進制名稱。

有效類名的

例子包括:

"java.lang.String" 
"javax.swing.JSpinner$DefaultEditor" 
"java.security.KeyStore$Builder$FileBuilder$1" 
"java.net.URLClassLoader$3$1" 

代表團之前,絕對的資源名稱是從給定的資源名稱中使用此算法構建:

  • 如果名字以開頭的「/ '('\ u002f'),那麼絕對名稱爲 的資源是名稱中'/'後面的部分。
  • 否則,絕對名稱是以下形式的:
    modified_pa​​ckage_name /名稱

凡modified_pa​​ckage_name是該對象以「/」取代的包名「」 ( '\ u002e')。

所以,你應該使用:

source = "Package_name" + ".folder.test" //remove the ".txt" from the file 
FileCopyFromJAR.class.getResourceAsStream(source); 
+0

如果我使用「test.txt」並且它位於.jar文件的根目錄下,它可以工作嗎?在任何情況下,當我使用FileCopyFromJAR.copy(「folder.test」,「c:\\ test12.txt」)調用靜態方法時,我仍然得到一個NullPointerException。這將在folder.test中傳遞給靜態拷貝方法中的「源代碼」。 – Trinculo

+0

@Trinculo那裏...它應該與包名稱一起工作。 – Typo

相關問題