猿问

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

我正在编写一些 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/blahand filename1=/tmp/blah/foo和filename2= /tmp/blah/bar。


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


偶然的你
浏览 142回答 3
3回答

qq_花开花谢_0

我想你误会了。这些操作实际上是同步的,所以你很高兴来到这里。Files.write以 ajava.io.OutputStream为例。Some NamecreateDirectory解决了Linux的可能实现。在 Windows 上,createDirectory使用CreateDirectory WinAPI 函数。WindowsNativeDispatcher.CreateDirectory(var3.getPathForWin32Calls(), var4.address() /* Security descriptor */);Buffers,Channels并且Selectors是非阻塞的。

不负相思意

我已经想通了。问题实际上不在于 Files 类的非阻塞性质。我混合了 File 对象和 Path 对象,并在它们之间进行转换,java 似乎对目录和文件是什么感到困惑,而是创建了被调用的文件,blah/foo而blah/bar不是foo在名为blah. 我刚刚切换到传递 Path 对象而不是 File 对象来表示我的文件和目录,并且一切正常。

一只萌萌小番薯

是否有“正确”的方法来确定 Files.createDirectories(path) 何时完成一回来就完成了。这很可能是一个简单的包装mkdir(2)此外,非阻塞语义对常规文件没有影响(至少在 Linux 中,至少现在)http://man7.org/linux/man-pages/man2/open.2.htmlO_NONBLOCK 或 O_NDELAY[...]请注意,此标志对常规文件和块设备无效;也就是说,无论是否设置了 O_NONBLOCK,当需要设备活动时,I/O 操作都会(短暂地)阻塞。
随时随地看视频慕课网APP

相关分类

Java
我要回答