【问题标题】:NoSuchFileException adding file to ZIP using Java NIONoSuchFileException 使用 Java NIO 将文件添加到 ZIP
【发布时间】:2015-06-08 19:49:57
【问题描述】:

我在使用 Java NIO 将文件添加到现有 ZIP 时遇到了一个令人沮丧的问题。

在测试 2500 个文件时,有 2 或 3 个文件会失败。我将文件添加到 ZIP 的根目录而不是子文件夹中(这似乎是其他帖子中某些问题的根源)。

奇怪的是,它声称不存在的异常消息中引用的文件既不是 ZIP 也不是正在添加的文件,而是 Java 在构建新 ZIP 文件时创建的临时文件。这是代码(少了try/catch):

Map<String, String> zipProps = new HashMap<>();
zipProps.put("create", "false");
zipProps.put("encoding", "UTF-8");
FileSystem zipFs = null;

URI zipAsFileSys = new URI("jar", fileToArchive.toURI().toString(), null);
zipFs = FileSystems.newFileSystem(zipAsFileSys, zipProps);
Path pathToNewFileInZip = zipFs.getPath(fileIdFile.getName());
Path pathToNewFileOnDisk = Paths.get(fileIdFile.getAbsolutePath());
Files.createFile(pathToNewFileInZip ); //Added later. No difference.
Files.copy(pathToNewFileOnDisk, pathToNewFileInZip, StandardCopyOption.REPLACE_EXISTING);
if(zipFs!=null) zipFs.close(); 

还有一个例外:

Exception: java.nio.file.NoSuchFileException: \\Server\archives\zipfstmp7224673021628877485.tmp

【问题讨论】:

    标签: java nio


    【解决方案1】:

    这最终归因于在远程驱动器上操作文件时的网络延迟和/或 Windows 缓存。

    似乎 Java 无法确定它刚刚创建的文件确实存在。如果可以获取 tmp 文件的句柄以查看它是否存在,那就太好了。

    鉴于我没有能力扰乱操作系统缓存,除了在 Files.copy(...) 调用之前引入延迟之外,我从来没有找到一个好的解决方法,而且因为我们的生产环境没有为这个确切的任务使用多个服务器,它并没有阻止我继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多