为什么Java中的FileChannel不是非阻塞的?
我想编写一个同时写入多个文件的程序; 认为通过使用非阻塞模式可以使用一个线程。 但FileChannel不支持非阻塞模式。 有人知道为什么吗?
UNIX不支持文件的非阻塞I / O,请参阅使用常规文件的非阻塞I / O. 由于Java应该(至少尝试)在所有平台上提供相同的行为,因此FileChannel
不会实现SelectableChannel
。
但是Java 7将包含一个新的AsynchronousFileChannel
类,它支持异步文件I / O,这是一种与非阻塞I / O不同的机制。 其中一个实现WindowsAsynchronousFileChannelImpl
受益于Windows上的非阻塞I / O API(请参阅Windows中的异步I / O )。
在此期间,您可以使用多个线程来实现相同的效果。 但这已经在SimpleAsynchronousFileChannelImpl
中实现,它可以在所有操作系统中移植。
通常,只有套接字和管道通过select()
机制真正支持非阻塞I / O.
@Trying评论如此:
“AsynchronousFileChannel支持异步I / O而不是非阻塞。”
在我看来,异步I / O(使用例如Future
或CompletionHandler
)是一种非阻塞I / O.
- 它不会阻塞在通道上执行
read(...)
调用的线程。 - 您可以使用
Future.isDone()
来避免以后阻止。
(当然,使用Selector
I / O也可以是异步的……取决于你如何使用API。)
相反,如果您在FileChannel
上读取并且当前没有可用的数据,则线程会阻塞…(通常)直到数据可用。
简而言之,大多数操作系统不会将常规文件视为可以阻止的内容 – 因此它们不允许您将它们显式设置为非阻塞状态。