Java的Zip文件系统提供程序:只读远程驱动器上的[Windows](Java Zip File

2019-10-20 12:04发布

我有一个问题Zip文件系统提供 :如果压缩文件是一个远程驱动器上(映射或不似乎是无关紧要的),虚拟文件系统是只读的,虽然文件本身不是。 我写了一个最小的示例代码:

public static void main(String[] args) throws IOException {
    File workingDir = new File(args[0]);
    File source = new File(workingDir, "in.zip");
    File target = new File(workingDir, "out.zip");
    Files.copy(source.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);

    try (FileSystem zipfs = FileSystems.newFileSystem(target.toPath(), null)) {
        Path pathInZipfile = zipfs.getPath("test.xml");
        System.out.println("zipfile writable: " + target.canWrite());
        System.out.println("zipFS writable: " + !zipfs.isReadOnly());
        Files.delete(pathInZipfile);
        System.out.println("File successfully deleted");   
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果工作目录是本地目录,一切工作正常。 但是,如果它是一个(映射)远程驱动器,我得到:

zipfile writable: true
zipFS writable: false
Exception in thread "main" java.nio.file.ReadOnlyFileSystemException
    at com.sun.nio.zipfs.ZipFileSystem.checkWritable(ZipFileSystem.java:155)
    at com.sun.nio.zipfs.ZipFileSystem.deleteFile(ZipFileSystem.java:1335)
    at com.sun.nio.zipfs.ZipPath.delete(ZipPath.java:655)
    at com.sun.nio.zipfs.ZipFileSystemProvider.delete(ZipFileSystemProvider.java:206)
    at java.nio.file.Files.delete(Unknown Source)
    at zipfs.ZipFS.main(ZipFS.java:23)

难道我做错了什么? 它是不可能的? 有没有解决办法?

Answer 1:

我遇到了同样的事情,我看了看JDK代码。

发现

在ZipFileSystem.java有三个相关的线路:

zfpath.getFileSystem().provider().checkAccess(zfpath, AccessMode.READ);
if (!Files.isWritable(zfpath))
    this.readOnly = true;

zfPath是一个Path对象。 一些在Windows文件系统提供块写访问一个zip压缩文件的路径。 似乎并不喜欢有很多关于工作要做。

解决方法

我作为一个解决方法是:

  1. 在一个临时文件夹中创建的zip压缩包
  2. 填充zip压缩包
  3. 临时文件复制到原来的映射驱动器位置

只要映射的驱动器是在拉链文件系统以外的上下文可写的,这种方法的工作原理。



Answer 2:

尝试私有字段设置readOnlyZipFileSystemfalse与反思。



文章来源: Java Zip File System Provider: ReadOnly on remote drive [Windows]