从.jar文件复制文件夹

时间:2014-06-26 22:05:34

标签: java jar

我创建了一个名为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等各种组合,但似乎没什么用。有没有办法让这项工作或我必须使用不同的方法?

2 个答案:

答案 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"

在委托之前,使用此算法从给定的资源名称构造绝对资源名称:

  • 如果名称以'/'('\ 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);