为什么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(使用例如FutureCompletionHandler )是一种非阻塞I / O.

  • 它不会阻塞在通道上执行read(...)调用的线程。
  • 您可以使用Future.isDone()来避免以后阻止。

(当然,使用Selector I / O也可以是异步的……取决于你如何使用API​​。)

相反,如果您在FileChannel上读取并且当前没有可用的数据,则线程会阻塞…(通常)直到数据可用。

简而言之,大多数操作系统不会将常规文件视为可以阻止的内容 – 因此它们不允许您将它们显式设置为非阻塞状态。