当前位置:首页 > Java

java如何使用nio

2026-03-21 13:59:15Java

Java NIO 基础概念

Java NIO(New I/O)是一种基于通道(Channel)和缓冲区(Buffer)的高效I/O模型,支持非阻塞操作和选择器(Selector)机制,适用于高并发场景。

核心组件

缓冲区(Buffer)
缓冲区是数据的临时存储区,分为多种类型(如 ByteBufferCharBuffer)。通过 allocate() 方法创建:

ByteBuffer buffer = ByteBuffer.allocate(1024); // 分配1024字节的缓冲区

通道(Channel)
通道是数据双向传输的管道,常见实现类包括 FileChannelSocketChannelServerSocketChannel

文件读写示例

通过 FileChannel 读写文件:

try (FileChannel channel = FileChannel.open(Paths.get("test.txt"), StandardOpenOption.READ)) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    channel.read(buffer); // 读取数据到缓冲区
    buffer.flip(); // 切换为读模式
    while (buffer.hasRemaining()) {
        System.out.print((char) buffer.get());
    }
} catch (IOException e) {
    e.printStackTrace();
}

非阻塞网络通信

使用 Selector 实现非阻塞Socket通信:

Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT); // 注册接受连接事件

while (true) {
    selector.select(); // 阻塞直到有事件就绪
    Set<SelectionKey> keys = selector.selectedKeys();
    Iterator<SelectionKey> iter = keys.iterator();
    while (iter.hasNext()) {
        SelectionKey key = iter.next();
        if (key.isAcceptable()) {
            SocketChannel client = serverChannel.accept();
            client.configureBlocking(false);
            client.register(selector, SelectionKey.OP_READ); // 注册读事件
        } else if (key.isReadable()) {
            SocketChannel client = (SocketChannel) key.channel();
            ByteBuffer buffer = ByteBuffer.allocate(128);
            client.read(buffer);
            buffer.flip();
            System.out.println("Received: " + new String(buffer.array()));
        }
        iter.remove();
    }
}

内存映射文件

通过 FileChannel.map() 实现高效大文件处理:

java如何使用nio

try (FileChannel channel = FileChannel.open(Paths.get("large.bin"), 
        StandardOpenOption.READ, StandardOpenOption.WRITE)) {
    MappedByteBuffer mappedBuffer = channel.map(
        FileChannel.MapMode.READ_WRITE, 0, channel.size());
    mappedBuffer.putInt(0, 123); // 直接修改文件内容
} catch (IOException e) {
    e.printStackTrace();
}

注意事项

  • 缓冲区状态管理:调用 flip()clear()rewind() 切换读写模式。
  • 资源释放:确保通道和选择器通过 try-with-resources 或手动关闭。
  • 性能优化:使用直接缓冲区(ByteBuffer.allocateDirect())减少JVM堆内存拷贝开销。

分享给朋友:

相关文章

java如何输出

java如何输出

输出到控制台 使用 System.out.println() 方法输出内容到控制台,适用于调试或简单信息展示。 示例代码: System.out.println("Hello, World!")…

如何学java

如何学java

学习Java的基础知识 Java是一门面向对象的编程语言,掌握基础语法是入门的关键。需要了解变量、数据类型、运算符、控制结构(如if-else、for循环、while循环)、数组等概念。可以通过官方文…

java如何自学

java如何自学

确定学习目标和路径 自学Java需要明确目标,例如开发Web应用、Android应用或后端服务。根据目标选择学习重点,如Java基础、Spring框架或Android开发。制定阶段性计划,从基础语法到…

java如何删除文件

java如何删除文件

删除文件的基本方法 使用 java.io.File 类的 delete() 方法可以删除文件。如果文件存在且删除成功,返回 true;否则返回 false。 import java.io.Fil…

java如何产生随机数

java如何产生随机数

使用 Math.random() 方法 Math.random() 生成一个范围在 [0.0, 1.0) 的伪随机 double 值。通过缩放和偏移可以生成指定范围的随机数。 double ra…

如何安装java软件

如何安装java软件

下载Java安装包 访问Oracle官方网站或OpenJDK开源项目页面,选择适合操作系统的Java版本(如Windows、macOS或Linux)。对于个人使用,通常下载JDK(Java Devel…