在Java开发中,处理输入输出(IO)操作是常见需求。传统IO(java.io包)采用阻塞式模型,在高并发场景下性能受限。为解决这一问题,Java 1.4引入了java.nio(New IO 或 Non-blocking IO)包,提供了更高效、可扩展的IO处理方式。
本教程将带你从零开始学习Java NIO的核心组件:Buffer(缓冲区)、Channel(通道)和Selector(选择器),帮助你掌握非阻塞IO编程技巧。
java.nio 是 Java 提供的一套用于替代传统 IO 的高性能 IO 框架。它基于缓冲区和通道模型,支持非阻塞操作,并通过 Selector 实现单线程管理多个连接,非常适合构建高并发服务器应用。
Buffer 是一个容器,用于存储数据。与传统 IO 直接读写不同,NIO 中所有数据都必须先放入 Buffer,再通过 Channel 传输。
常见的 Buffer 类型包括:
ByteBuffer:处理字节数据(最常用)CharBuffer:处理字符IntBuffer、LongBuffer 等:处理基本类型Buffer 有三个重要属性:
import java.nio.ByteBuffer;public class BufferExample { public static void main(String[] args) { // 创建一个容量为10的ByteBuffer ByteBuffer buffer = ByteBuffer.allocate(10); // 写入数据 buffer.put((byte) 'H'); buffer.put((byte) 'e'); buffer.put((byte) 'l'); // 切换到读模式(position=0, limit=当前position) buffer.flip(); // 读取数据 while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } // 输出: Hel }} Channel 类似于传统 IO 中的流,但它是双向的(可读可写),并且必须与 Buffer 配合使用。常见的 Channel 包括:
FileChannel:用于文件读写SocketChannel:用于 TCP 网络通信ServerSocketChannel:监听 TCP 连接DatagramChannel:用于 UDP 通信import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class FileCopyExample { public static void main(String[] args) throws Exception { RandomAccessFile fromFile = new RandomAccessFile("source.txt", "rw"); FileChannel fromChannel = fromFile.getChannel(); RandomAccessFile toFile = new RandomAccessFile("target.txt", "rw"); FileChannel toChannel = toFile.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while (fromChannel.read(buffer) != -1) { buffer.flip(); // 切换到读模式 toChannel.write(buffer); buffer.clear(); // 清空缓冲区,准备下一次写入 } fromFile.close(); toFile.close(); }} Selector 是实现非阻塞IO的关键。它允许单个线程监控多个 Channel 的事件(如连接、读、写),从而避免为每个连接创建线程,极大提升系统并发能力。
使用 Selector 的基本步骤:
import java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.util.Iterator;public class NIOServer { public static void main(String[] args) throws Exception { // 创建 ServerSocketChannel ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.bind(new InetSocketAddress(8080)); serverChannel.configureBlocking(false); // 设置为非阻塞 // 创建 Selector 并注册 channel Selector selector = Selector.open(); serverChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println("服务器启动,监听端口 8080..."); while (true) { selector.select(); // 阻塞直到有事件就绪 Iterator<SelectionKey> keys = selector.selectedKeys().iterator(); while (keys.hasNext()) { SelectionKey key = keys.next(); keys.remove(); if (key.isAcceptable()) { // 处理新连接 ServerSocketChannel server = (ServerSocketChannel) key.channel(); // 此处可接受新连接并注册到 selector System.out.println("新客户端连接!"); } // 可继续处理 READ/WRITE 事件 } } }} 通过本教程,你已经掌握了 java.nio 的三大核心组件:Buffer、Channel 和 Selector。它们共同构成了 Java 高性能 IO 的基础。
记住:
建议动手实践上述代码,加深对 非阻塞IO 和 Buffer和Channel 工作机制的理解。随着经验积累,你将能构建出高性能、可扩展的网络应用!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129114.html