Java NIO非阻塞入门

Java 的非阻塞 IO 用起来真是挺香的,尤其是写高并发服务器的时候,性能差距一眼就能看出来。

传统的 I/O 模型一到高并发场景就绷不住了,而NIO非阻塞机制,加上缓冲区通道,让你轻松搞定大批连接,线程少、响应快,代码也干净不少。

说到缓冲区,你就把它当成临时仓库,ByteBuffer用来存字节,CharBuffer搞字符,操作起来还挺直观的。位置、容量这些概念,玩两次就熟了。

通道的好处也,支持双向读写,效率比以前那套流式 I/O 高得多,而且可以直接用transferTo()transferFrom()快速搬数据。

选择器也值得说一嘴。配合非阻塞模式,一个线程可以盯好多个连接,还不用来回开线程池,做高性能服务端时有用。

如果你做的是网络服务文件传输或者实时这种活,NIO 绝对能让你少掉几根头发。性能上来,线程数下去,维护也省事。

下面这个小 demo 就是个入门级的文件读写例子,用FileChannelByteBuffer读取一个文件写到另一个文件里:

FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inChannel.read(buffer) != -1) {
  buffer.flip();
  outChannel.write(buffer);
  buffer.clear();
}
inChannel.close();
outChannel.close();

嗯,这种写法干净,而且扩展起来也方便。读写逻辑控制得住,不卡线程,还挺顺。

如果你之前还没上手NIO,现在入门正合适。再配合下面这些资料看看,理解会更快:

如果你做的是 IO 密集型应用,真的值得抽点时间把 NIO 玩熟一点,收益还挺大的。

pdf 文件大小:487.83KB