我正在编写一些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/foo
和filename2
= /tmp/blah/bar
。
很明显,我可以使用其他类或库(例如Commons IO)来完成此操作,但是java.nio.Files中的构建非常好。
答案 0 :(得分:3)
我认为你误会了。这些操作实际上是同步的,因此您可以转到此处。 Files.write
例如使用java.io.OutputStream
。
Some Name 解决了createDirectory
在Linux上的可能实现。
在Windows上,createDirectory
使用{{3}} WinAPI函数。
WindowsNativeDispatcher.CreateDirectory(var3.getPathForWin32Calls(), var4.address() /* Security descriptor */);
Buffers
,Channels
和Selectors
是无阻塞。
答案 1 :(得分:1)
我知道了。问题实际上与Files类的非阻塞性质无关。我混合了File对象和Path对象,并在它们之间进行转换,java似乎对目录和文件的名称感到困惑,而是创建了名为blah/foo
和blah/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。