簡體   English   中英

從.jar文件復制文件夾

[英]Copying a folder from a .jar file

我創建了一個名為FileCopyFromJAR的類,該類具有一個稱為copy的靜態方法。 這使我可以使用getResourceAsStream將文件復制到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等,但似乎無濟於事。 有沒有辦法使這項工作有效,還是必須使用其他方法?

我想到了! 我出版了《 Core Java Volume 1》第9版,上面寫着“請注意,無論實際存儲資源文件的系統上的目錄分隔符是什么,都必須始終使用/分隔符。” (Horstmann,第571頁,第10.1章JAR文件)。

所以這有效:

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

希望這可以幫助任何人! 這讓我發瘋了!

根據class.getResourceAsStream 文檔 :“用於搜索與給定類關聯的資源的規則由該類的定義類加載器實現。”

然后對於加載程序類,我們有:

在ClassLoader中作為String參數提供給方法的任何類名稱都必須是Java語言規范定義的二進制名稱。

有效類名的示例包括:

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

在委派之前,使用以下算法從給定資源名稱構造絕對資源名稱:

  • 如果名稱以'/'('\\ u002f')開頭,則資源的絕對名稱是名稱中'/'之后的部分。
  • 否則,絕對名稱的格式如下:
    modified_pa​​ckage_name /名稱

其中Modifyed_pa​​ckage_name是此對象的軟件包名稱,用“ /”代替“。”。 ( '\\ u002e')。

所以你應該使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM