Files.createFile()有异步行为吗?

时间:2015-11-18 18:05:18

标签: java file asynchronous io synchronous

我在使用Files.createFile()的测试服务器上得到了一个非常奇怪的行为。

代码看起来像这样:

Files.createFile(myPath);
... code adding that file to a zip file ...

在myPath创建的文件有些内容未包含在zip内容中,通常不包括在内,也不会抛出异常。我永远无法在运行CentOS 6.6版(最终版)的测试服务器之外重现该问题并且具有ext4文件系统。在createFile之后执行Files.exists(myPath)总是返回true。

我尝试在文件中写几个字符来检查它是否有所不同,但事实并非如此。

FileUtils.writeStringToFile(testLog.toFile(), "Test content");

如果我在中间添加一个短暂的睡眠,那么该文件将始终包含在zip中。

始终如一地工作:

Files.createFile(myPath);
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    //interrupted
}
... code adding that file to a zip file ...

我对此的看法是文件系统中存在一些奇怪的异步行为,因为Thread.sleep()在此代码中永远不会有任何区别。

有没有人明确解释睡眠会如何产生影响?

编辑:我的问题实际上不是关于压缩方法,而是关于createFile方法异步行为,而不应该。

感谢您的帮助!

1 个答案:

答案 0 :(得分:-1)

为什么不使用zip文件系统提供程序?

final Path zipPath = Paths.get("pathToZipFileHere");
final URI uri = URI.create("jar:" + zipPath.toUri());

final Path fileInZip;

// Open the zip as a filesystem
try (
    final FileSystem fs = FileSystems.newFileSystem(uri,
        Collections.emptyMap());
) {
    fileInZip = fs.getPath("path/in/zip");
    // work with fileInZip
}