为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2022-06-23 17:32:58
我正在编写一些 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 中的构建非常好。
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

我想你误会了。这些操作实际上是同步的,所以你很高兴来到这里。Files.write以 ajava.io.OutputStream为例。

Some NamecreateDirectory解决了Linux的可能实现。
在 Windows 上,createDirectory使用CreateDirectory WinAPI 函数。

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

BuffersChannels并且Selectors非阻塞的


查看完整回答
反对 回复 2022-06-23
?
不负相思意

TA贡献1777条经验 获得超10个赞

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



查看完整回答
反对 回复 2022-06-23
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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

一回来就完成了。这很可能是一个简单的包装mkdir(2)

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

O_NONBLOCK 或 O_NDELAY

[...]

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


查看完整回答
反对 回复 2022-06-23
  • 3 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信