如何使用Java 7 Files API等待操作完成?

问题描述 投票:3回答:3

我正在编写一些创建目录的java代码,然后将一些文件放在该目录中。我不关心文件的创建顺序,但是,要成功创建文件,目录需要先退出。

我想使用(newish)java.nio.Files api,因为它有一套优雅的方法来处理文件和目录。

虽然Files类是非阻塞的很好,但这意味着该目录并不总是存在。是否有“正确”的方法来确定Files.createDirectories(path)何时完成?

不是特别复杂(这就是我喜欢Files api的原因)但是这里有一些示例代码:

Files.createDirectories(path);
Files.write(filename1, "some content".getBytes());
Files.write(filename2, "some other content".getBytes());

在上面path可能是/tmp/blahfilename1 = /tmp/blah/foofilename2 = /tmp/blah/bar

显然我可以使用其他类或库(如Commons IO)来做到这一点,但java.nio.Files中的构建非常好。

java nio
3个回答
3
投票

我觉得你误解了。这些操作实际上是同步的,所以你很高兴去这里。例如,Files.write使用java.io.OutputStream

一些名称解决了createDirectory for Linux的可能实现问题。 在Windows上,createDirectory使用CreateDirectory WinAPI函数。

WindowsNativeDispatcher.CreateDirectory(var3.getPathForWin32Calls(), var4.address() /* Security descriptor */);

BuffersChannelsSelectors是无阻塞的。


1
投票

我已经明白了。实际上问题不在于Files类的非阻塞性质。我正在混合File对象和Path对象并在它们之间进行转换,java似乎与目录和文件的混淆相反,而是创建了名为blah/fooblah/bar的文件,而不是在名为foo的文件夹中调用blah文件。我刚刚切换到传递Path对象而不是File对象来表示我的文件和目录,一切正常。


1
投票

是否有“正确”的方法来确定Files.createDirectories(路径)何时完成

一旦它返回它就完成了。这很可能是qazxsw poi的简单包装

此外,非阻塞语义对常规文件没有影响(至少在Linux和至少现在)mkdir(2)

O_NONBLOCK或O_NDELAY

[...]

请注意,此标志对常规文件和块设备无效;也就是说,无论是否设置了O_NONBLOCK,I / O操作都会(暂时)阻止何时需要设备活动。

© www.soinside.com 2019 - 2024. All rights reserved.