为什么Java中的FileChannel不是非阻塞的?

use*_*158 18 java nio

我想编写一个同时写入多个文件的程序; 认为通过使用非阻塞模式可以使用一个线程.但FileChannel不支持非阻塞模式.有人知道为什么吗?

Ste*_*n C 14

UNIX不支持非阻塞I/O的文件,请参阅非阻塞I/O与常规文件.由于Java应该(至少尝试)在所有平台上提供相同的行为,因此FileChannel不会实现SelectableChannel.

但是,Java 7将包含一个AsynchronousFileChannel支持异步文件I/O 的新类,这是一种与非阻塞I/O不同的机制.其中一个实现select()受益于Windows上的非阻塞I/O API(请参阅Windows中的异步I/O).

在此期间,您可以使用多个线程来实现相同的效果.但这已经实现,FileChannel可在所有操作系统中移植.

通常,只有套接字和管道真正支持通过SelectableChannel机制的非阻塞I/O.


@Trying评论如此:

"AsynchronousFileChannel支持异步I/O而不是非阻塞."

在我看来,异步I/O(使用例如AsynchronousFileChannel或a select())是一种非阻塞I/O.

  • 它不会阻止FileChannel在通道上执行调用的线程.
  • 您可以使用SelectableChannel以避免以后阻止.

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

相比之下,如果您读取a select()并且当前没有可用的数据,则线程会阻塞...(通常)直到数据可用.

  • +1.asynchronousFileChannel支持异步I/O而不是非阻塞.请检查.谢谢. (2认同)