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

为什么Java中的FileChannel不是非阻塞的?,java,nio,Java,Nio,我想写一个同时写入多个文件的程序;我认为通过使用非阻塞模式使用一个线程是可能的。但FileChannel不支持非阻塞模式。有人知道原因吗?简单地说,大多数操作系统都不会将常规文件视为可以阻止的文件,因此它们不允许您显式地将其设置为非阻止状态。UNIX不支持文件的非阻止I/O,请参阅。由于Java应该(至少尝试)在所有平台上提供相同的行为,FileChannel没有实现SelectableChannel 然而,Java7将包含一个支持异步文件I/O的新类,这是一种与非阻塞I/O不同的机制 通常,只

我想写一个同时写入多个文件的程序;我认为通过使用非阻塞模式使用一个线程是可能的。但FileChannel不支持非阻塞模式。有人知道原因吗?

简单地说,大多数操作系统都不会将常规文件视为可以阻止的文件,因此它们不允许您显式地将其设置为非阻止状态。

UNIX不支持文件的非阻止I/O,请参阅。由于Java应该(至少尝试)在所有平台上提供相同的行为,
FileChannel
没有实现
SelectableChannel

然而,Java7将包含一个支持异步文件I/O的新类,这是一种与非阻塞I/O不同的机制


通常,只有套接字和管道通过
select()
机制真正支持非阻塞I/O。

文件I/O只能被阻塞,因为它们被视为非阻塞?你这是什么意思?在编程中,每个操作都是阻塞的。@Val我同意这里的措辞不是最好的。在编程中,并不是每个操作都是阻塞的(从某种意义上说,它使进程或线程处于阻塞状态)。我的意思是,对于一个常规文件,操作系统级API假设read()/write()/open()和对常规文件的其他调用是非阻塞的——尽管这是错误的假设。常规/标准操作系统级API无法将文件句柄从阻塞更改为非阻塞。(这可以通过套接字和管道句柄来实现)。@nos操作系统级API假定
read()/write()/open()
和其他调用被阻塞。不清楚你在说什么。@EJP我不认为read()write()假设任何关于阻塞的东西。对于某些类型的设备,您当然可以使read()/write()成为非阻塞的。我只是说,您不能在引用常规文件的文件描述符上设置或清除O_NONBLOCK(或任何类似属性)并观察任何差异。例如,select()调用总是告诉您文件描述符是可读写的。虽然read()或write()在现实中可能会被阻塞,但操作系统仍然无法为程序员提供任何方法来控制、了解或通知它的阻塞