NoSuchFileException使用Java NIO将文件添加到ZIP

NoSuchFileException使用Java NIO将文件添加到ZIP,java,nio,Java,Nio,我在使用JavaNIO向现有ZIP添加文件时遇到了一个令人沮丧的问题 在测试2500个文件时,2或3个文件将失败。我将文件添加到ZIP的根目录中,而不是子文件夹中(这似乎是其他帖子中某些问题的根源) 奇怪的是,它声称不存在的异常消息中引用的文件既不是ZIP文件,也不是正在添加的文件,而是Java在构建新ZIP文件时创建的临时文件。以下是代码(不包括try/catch): 这最终可追溯到操作远程驱动器上的文件时的网络延迟和/或Windows缓存 Java似乎无法确定它刚刚创建的文件是否确实存在。如

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

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

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


这最终可追溯到操作远程驱动器上的文件时的网络延迟和/或Windows缓存

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

由于我没有能力处理操作系统缓存,因此除了在Files.copy(…)调用之前引入延迟之外,我从未找到一个好的解决方法,而且因为我们的生产环境不使用多台服务器来完成这项任务,这并没有阻止我继续进行

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