在 Java 中,I/O 操作可以是阻塞的,也可以是非阻塞的。

阻塞 I/O

  • 读操作: 如果没有数据可读,read() 方法会一直阻塞,直到有数据可读或发生错误。即使有部分数据可读,如果数据量小于指定的长度,read() 方法也会立即返回,而不是等待所有数据都准备好。
  • 写操作: write() 方法会一直阻塞,直到所有数据都写入完成或发生错误。

非阻塞 I/O

  • 读操作: 如果没有数据可读,read() 方法会立即返回,并返回一个错误码(通常是 EAGAIN)。如果有数据可读,read() 方法会读取尽可能多的数据,并返回实际读取的字节数。
  • 写操作: write() 方法会尝试写入尽可能多的数据,并返回实际写入的字节数。

总结

阻塞 I/O 操作在数据准备好之前或写入完成之前会一直阻塞线程,而 非阻塞 I/O 操作则会立即返回, regardless of whether data is available or not. 选择哪种 I/O 模型取决于具体的应用场景。