如何使用 Java 7 个文件 API 等待操作完成?
How do I wait for completion of operations using the Java 7 Files API?
我正在编写一些 java 代码来创建一个目录,然后将一些文件放入该目录。我不关心创建文件的顺序,但是,要成功创建文件,目录需要先退出。
我想使用(新的)java.nio.Files api,因为它有一套非常优雅的处理文件和目录的方法。
虽然 Files
class 是非阻塞的很好,但这意味着该目录并不总是存在。是否有 "right" 方法来确定 Files.createDirectories(path)
何时完成?
不是特别复杂(这就是我喜欢文件 api 的原因)但这里有一些示例代码:
Files.createDirectories(path);
Files.write(filename1, "some content".getBytes());
Files.write(filename2, "some other content".getBytes());
上面的path
可能是/tmp/blah
and filename1
= /tmp/blah/foo
and filename2
= /tmp/blah/bar
.
显然我可以使用其他一些 class 或库(如 Commons IO)来做到这一点,但是 java.nio.Files 中的构建非常好。
我想你误会了。这些操作实际上是同步的,所以你可以去这里。 Files.write
例如使用 java.io.OutputStream
。
Some Name 解决了 Linux.
的可能实施 createDirectory
在 Windows 上,createDirectory
使用 CreateDirectory WinAPI 函数。
WindowsNativeDispatcher.CreateDirectory(var3.getPathForWin32Calls(), var4.address() /* Security descriptor */);
Buffers
、Channels
和 Selectors
是 非阻塞.
我已经弄明白了。问题实际上并不在于文件 class 的非阻塞性质。我正在混合 File 对象和 Path 对象并在它们之间进行转换,java 似乎混淆了目录和文件是什么,而是创建了名为 blah/foo
和 blah/bar
的文件,而不是在名为 blah
的文件夹中有一个名为 foo
的文件。我刚刚切换为传递 Path 对象而不是 File 对象来表示我的文件和目录,一切正常。
Is there a "right" way to determine when the
Files.createDirectories(path) has completed
一returns就完成了。这很可能是 mkdir(2)
的简单包装
此外,非阻塞语义对常规文件没有影响(至少在 Linux 和至少现在)http://man7.org/linux/man-pages/man2/open.2.html
O_NONBLOCK or O_NDELAY
[...]
Note that this flag has no effect for regular files and
block devices; that is, I/O operations will (briefly) block
when device activity is required, regardless of whether
O_NONBLOCK is set.
我正在编写一些 java 代码来创建一个目录,然后将一些文件放入该目录。我不关心创建文件的顺序,但是,要成功创建文件,目录需要先退出。
我想使用(新的)java.nio.Files api,因为它有一套非常优雅的处理文件和目录的方法。
虽然 Files
class 是非阻塞的很好,但这意味着该目录并不总是存在。是否有 "right" 方法来确定 Files.createDirectories(path)
何时完成?
不是特别复杂(这就是我喜欢文件 api 的原因)但这里有一些示例代码:
Files.createDirectories(path);
Files.write(filename1, "some content".getBytes());
Files.write(filename2, "some other content".getBytes());
上面的path
可能是/tmp/blah
and filename1
= /tmp/blah/foo
and filename2
= /tmp/blah/bar
.
显然我可以使用其他一些 class 或库(如 Commons IO)来做到这一点,但是 java.nio.Files 中的构建非常好。
我想你误会了。这些操作实际上是同步的,所以你可以去这里。 Files.write
例如使用 java.io.OutputStream
。
Some Name 解决了 Linux.
的可能实施 createDirectory
在 Windows 上,createDirectory
使用 CreateDirectory WinAPI 函数。
WindowsNativeDispatcher.CreateDirectory(var3.getPathForWin32Calls(), var4.address() /* Security descriptor */);
Buffers
、Channels
和 Selectors
是 非阻塞.
我已经弄明白了。问题实际上并不在于文件 class 的非阻塞性质。我正在混合 File 对象和 Path 对象并在它们之间进行转换,java 似乎混淆了目录和文件是什么,而是创建了名为 blah/foo
和 blah/bar
的文件,而不是在名为 blah
的文件夹中有一个名为 foo
的文件。我刚刚切换为传递 Path 对象而不是 File 对象来表示我的文件和目录,一切正常。
Is there a "right" way to determine when the Files.createDirectories(path) has completed
一returns就完成了。这很可能是 mkdir(2)
此外,非阻塞语义对常规文件没有影响(至少在 Linux 和至少现在)http://man7.org/linux/man-pages/man2/open.2.html
O_NONBLOCK or O_NDELAY
[...]
Note that this flag has no effect for regular files and block devices; that is, I/O operations will (briefly) block when device activity is required, regardless of whether O_NONBLOCK is set.