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

时间:2019-02-17 19:08:19

标签: java nio

我正在编写一些Java代码,这些代码创建一个目录,然后将一些文件放入该目录中。我不在乎文件的创建顺序,但是,要成功创建文件,必须先退出目录。

我想使用(新的)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/blah,并且filename1 = /tmp/blah/foofilename2 = /tmp/blah/bar

很明显,我可以使用其他类或库(例如Commons IO)来完成此操作,但是java.nio.Files中的构建非常好。

3 个答案:

答案 0 :(得分:3)

我认为你误会了。这些操作实际上是同步的,因此您可以转到此处。 Files.write例如使用java.io.OutputStream

Some Name 解决了createDirectory在Linux上的可能实现。
在Windows上,createDirectory使用{{3}} WinAPI函数。

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

BuffersChannelsSelectors无阻塞

答案 1 :(得分:1)

我知道了。问题实际上与Files类的非阻塞性质无关。我混合了File对象和Path对象,并在它们之间进行转换,java似乎对目录和文件的名称感到困惑,而是创建了名为blah/fooblah/bar的文件,而不是称为{ {1}}在名为foo的文件夹中。我只是切换到传递路径对象而不是文件对象来表示我的文件和目录,并且一切正常。

答案 2 :(得分:1)

  

是否有一种“正确”的方法来确定何时   Files.createDirectories(path)已完成

返回后立即完成。很可能这是mkdir(2)

的简单包装

此外,非阻塞语义对常规文件没有影响(至少在Linux中并且至少在现在如此)http://man7.org/linux/man-pages/man2/open.2.html

  

O_NONBLOCK或O_NDELAY

     

[...]

     

请注意,此标志对于常规文件和   块设备;也就是说,I / O操作将(简短地)阻塞   何时需要设备活动,无论是否   设置为O_NONBLOCK。