我创建了一个名为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等各种组合,但似乎没什么用。有没有办法让这项工作或我必须使用不同的方法?
答案 0 :(得分:2)
我明白了!我打破了我的“核心Java第1卷”第9版本书,它说:“请注意,无论实际存储资源文件的系统上的目录分隔符如何,都必须始终使用/ separator。” (Horstmann,第571页,第10.1章JAR文件)。
这样可行:
FileCopyFromJAR.copy("/folder/test.txt", "c:\\test12.txt");
希望这可以帮助那里的任何人!这让我发疯了!
答案 1 :(得分:0)
根据class.getResourceAsStream documentation:“搜索与给定类关联的资源的规则由类的定义class loader实现。”
然后对于装载机类我们有:
作为ClassLoader中方法的String参数提供的任何类名必须是Java Language Specification定义的二进制名称。
有效类名的示例包括:
"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"
在委托之前,使用此算法从给定的资源名称构造绝对资源名称:
其中modified_package_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。强>
所以你应该使用:
source = "Package_name" + ".folder.test" //remove the ".txt" from the file
FileCopyFromJAR.class.getResourceAsStream(source);