将文件添加到zip文件java中的文件夹中

时间:2013-06-13 09:30:07

标签: java zip nio

我正在尝试将txt文件添加到zip文件中的文件夹中。 首先,我提取了zip文件的所有内容,然后添加了txt文件然后再压缩。 然后我读了一下nio方法,我可以修改zip而不提取它。使用这种方法,我可以将txt文件添加到zip的主文件夹,但我不能更深入。

testing.zip文件中有res文件夹。

这是我的代码:

        Path txtFilePath = Paths.get("\\test\\prefs.txt");
        Path zipFilePath = Paths.get("\\test\\testing.zip");
        FileSystem fs;
        try {
            fs = FileSystems.newFileSystem(zipFilePath, null);
            Path fileInsideZipPath = fs.getPath("res/prefs.txt");  //when I remover "res/" code works.
            Files.copy(txtFilePath, fileInsideZipPath);
            fs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

我得到以下异常:

java.nio.file.NoSuchFileException: res/

2 个答案:

答案 0 :(得分:2)

(编辑以给出实际答案)

执行:

fs.getPath("res").resolve("prefs.txt")

而不是:

fs.getPath("res/prefs.txt")

.resolve()方法将对文件分隔符等做正确的事。

答案 1 :(得分:2)

fs.getPath("res/prefs.txt")当然可以正常工作,您无需将其拆分为fs.getPath("res").resolve("prefs.txt"),因为已批准的答案说明了这一点。

异常java.nio.file.NoSuchFileException: res/有点令人困惑,因为它提到了文件,但实际上目录丢失了。

我遇到了类似的问题,我所要做的就是:

if (fileInsideZipPath.getParent() != null)
   Files.createDirectories(fileInsideZipPath.getParent());

参见完整示例:

@Test
public void testAddFileToArchive() throws Exception {
    Path fileToAdd1 = rootTestFolder.resolve("notes1.txt");
    addFileToArchive(archiveFile, "notes1.txt", fileToAdd1);

    Path fileToAdd2 = rootTestFolder.resolve("notes2.txt");
    addFileToArchive(archiveFile, "foo/bar/notes2.txt", fileToAdd2);

    . . . 
}


public void addFileToArchive(Path archiveFile, String pathInArchive, Path srcFile) throws Exception {        
    FileSystem fs = FileSystems.newFileSystem(archiveFile, null);
    Path fileInsideZipPath = fs.getPath(pathInArchive);
    if (fileInsideZipPath.getParent() != null) Files.createDirectories(fileInsideZipPath.getParent());
    Files.copy(srcFile, fileInsideZipPath, StandardCopyOption.REPLACE_EXISTING);
    fs.close();
}

如果我删除Files.createDirectories()位,并确保清除启动清除测试目录,我得到:

java.nio.file.NoSuchFileException: foo/bar/
at com.sun.nio.zipfs.ZipFileSystem.checkParents(ZipFileSystem.java:863)
at com.sun.nio.zipfs.ZipFileSystem.newOutputStream(ZipFileSystem.java:528)
at com.sun.nio.zipfs.ZipPath.newOutputStream(ZipPath.java:792)
at com.sun.nio.zipfs.ZipFileSystemProvider.newOutputStream(ZipFileSystemProvider.java:285)
at java.nio.file.Files.newOutputStream(Files.java:216)
at java.nio.file.Files.copy(Files.java:3016)
at java.nio.file.CopyMoveHelper.copyToForeignTarget(CopyMoveHelper.java:126)
at java.nio.file.Files.copy(Files.java:1277)
at my.home.test.zipfs.TestBasicOperations.addFileToArchive(TestBasicOperations.java:111)
at my.home.test.zipfs.TestBasicOperations.testAddFileToArchive(TestBasicOperations.java:51)