Java输入输出:什么是NIO(New I/O)?

简介: Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。

NIO(New I/O)是Java中的一种新输入输出库,它提供了一种更高效的文件读写方式。相比于传统的IO库,NIO具有以下特点:

  1. 非阻塞性:NIO支持非阻塞I/O操作,这意味着在执行I/O操作时,程序不会被阻塞,而是可以继续执行其他任务。

  2. 通道(Channel):NIO中的通道(Channel)是一个抽象概念,它可以表示文件、网络连接等I/O资源。通过通道,可以实现数据的读写和传输。

  3. 缓冲区(Buffer):NIO使用缓冲区来存储数据,这样可以提高数据传输的效率。缓冲区可以是字节缓冲区(ByteBuffer)或字符缓冲区(CharBuffer)。

  4. 选择器(Selector):NIO中的选择器(Selector)用于监控多个通道的状态变化,当某个通道有数据可读或可写时,可以选择器会通知应用程序。这样可以避免轮询多个通道,提高程序的性能。

下面是一个简单的NIO示例代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;

public class NIOExample {
   
    public static void main(String[] args) throws IOException {
   
        // 创建选择器
        Selector selector = Selector.open();

        // 打开服务器套接字通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.bind(new InetSocketAddress("localhost", 8080));

        // 注册到选择器,关注接受事件
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
   
            // 选择一组键,其相应的通道已为 I/O 操作准备就绪
            int readyChannels = selector.select();
            if (readyChannels == 0) continue;

            // 获取选择器选中的键集合
            Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator();
            while (keyIterator.hasNext()) {
   
                SelectionKey key = keyIterator.next();

                if (key.isAcceptable()) {
   
                    // 处理接受事件
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
   
                    // 处理读取事件
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = socketChannel.read(buffer);
                    if (bytesRead > 0) {
   
                        buffer.flip();
                        // 处理读取到的数据
                        while (buffer.hasRemaining()) {
   
                            System.out.print((char) buffer.get());
                        }
                        buffer.clear();
                    } else if (bytesRead < 0) {
   
                        // 客户端关闭连接
                        socketChannel.close();
                    }
                }

                // 移除已处理的键
                keyIterator.remove();
            }
        }
    }
}
目录
相关文章
|
6天前
|
存储 监控 Java
Java的NIO体系
通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
24 5
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
1月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
36 2
|
3月前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
3月前
|
Java API 调度
掌握Java线程状态:从NEW到TERMINATED
本文探讨了操作系统与Java中线程的状态及其转换。操作系统层面,线程状态包括初始、就绪、运行、阻塞和终止。Java线程状态则细分为NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,并详细介绍了各状态的特性和转换条件。此外,还列举了Java中常用的线程方法,如`wait()`、`notify()`、`start()`和`join()`等,帮助理解线程控制机制。
131 3
掌握Java线程状态:从NEW到TERMINATED
|
4月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
150 0
|
Java 编译器
【Java】终于可以给自己new对象了——Java类和对象(三)
【☕Java】,千呼万唤始出来,终于可以给自己new对象了——Java类和对象
【Java】终于可以给自己new对象了——Java类和对象(三)
|
Java 数据安全/隐私保护
【Java】终于可以给自己new对象了——Java类和对象(二)
【☕Java】,千呼万唤始出来,终于可以给自己new对象了——Java类和对象
【Java】终于可以给自己new对象了——Java类和对象(二)
|
存储 Java C语言
【Java】终于可以给自己new对象了——Java类和对象(一)
【☕Java】,千呼万唤始出来,终于可以给自己new对象了——Java类和对象
【Java】终于可以给自己new对象了——Java类和对象(一)
下一篇
DataWorks