Java Files.createFile()是否可以具有异步行为?
我在使用Files.createFile()的测试服务器上遇到了一个非常奇怪的行为 代码如下所示:Java Files.createFile()是否可以具有异步行为?,java,file,asynchronous,io,synchronous,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)始终返回
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 ...
我的观点是,文件系统中存在一些奇怪的异步行为,作为一个线程。sleep()在这段代码中永远不会有任何区别
有没有人能明确解释睡眠是如何起作用的
编辑:我这里的问题实际上不是关于zipping方法,而是关于createFile方法的异步行为,而它不应该
谢谢你的帮助 为什么不直接使用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
}
为什么不直接使用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
}
您只创建一个文件,但不将内容放入其中?显示将其放入zip文件的代码可能会有所帮助。问题可能就在那里。事实上,我尝试了两个不同的库,但从根本上说,它无法解释Thread.sleep的影响。我使用了zip4J和标准JavaZIP库,您使用的是什么操作系统?如果您没有执行足够的磁盘I/O来强制写入,那么磁盘上的实际文件创建可能会延迟。我在文档中也看不到任何关于此调用是同步的保证。事实上,它说“在大多数情况下,这里定义的方法将委托给相关的文件系统提供程序来执行文件操作。”因此,无论指定的文件系统提供程序想做什么,您都将受到摆布。这意味着我不能相信文件系统在
Files.createFile(myPath)之后创建了一个文件代码>。这意味着您不能可靠地使用java中的文件系统来操作数据。我希望每个java开发人员都会抱怨,如果是这样的话,不是吗?如果文件系统不保证在成功调用创建文件后可以访问该文件,则对我来说毫无价值。您只创建文件,但不将内容放入其中?显示将其放入zip文件的代码可能会有所帮助。问题可能就在那里。事实上,我尝试了两个不同的库,但从根本上说,它无法解释Thread.sleep的影响。我用的是zip4J和标准的JavaZip库。你用的是什么操作系统?如果您没有执行足够的磁盘I/O来强制写入,那么磁盘上的实际文件创建可能会延迟。我在文档中也看不到任何关于此调用是同步的保证。事实上,它说“在大多数情况下,这里定义的方法将委托给相关的文件系统提供程序来执行文件操作。”因此,无论指定的文件系统提供程序想做什么,您都将受到摆布。这意味着我不能相信文件系统在Files.createFile(myPath)之后创建了一个文件代码>。这意味着您不能可靠地使用java中的文件系统来操作数据。我希望每个java开发人员都会抱怨,如果是这样的话,不是吗?如果一个文件系统不能保证您在成功调用创建文件后可以访问该文件,那么它对我来说毫无价值。压缩方法与我无关。问题是为什么同步IO调用的行为是异步的?我怎么能相信经历这种行为的简单文件IO?我的意思是,虽然使用这种方法可能会解决最初的问题,但它并不能解释它。我真的很想得到这个案子的解释。但是这个方法确实很有趣,压缩的方法和我无关。问题是为什么同步IO调用的行为是异步的?我怎么能相信经历这种行为的简单文件IO?我的意思是,虽然使用这种方法可能会解决最初的问题,但它并不能解释它。我真的很想得到这个案子的解释。但这种方法确实很有趣。