使用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
答案 0 :(得分:0)
这最终可以追溯到操作远程驱动器上的文件时的网络延迟和/或Windows缓存。
似乎Java无法弄清楚它刚刚创建的文件是否存在。如果有可能获得tmp文件的句柄以查看它是否存在,那将是很好的。
由于我没有能力搞乱操作系统缓存,除了在Files.copy(...)调用之前引入延迟之外,我从来没有找到一个好的解决方法,并且因为我们的生产环境没有使用多个服务器完成这个确切的任务,它并没有阻止我继续进行。