[英]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"
在委派之前,使用以下算法從給定資源名稱構造絕對資源名稱:
其中Modifyed_package_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.