博客
关于我
详细JAVA-NIO介绍与使用
阅读量:311 次
发布时间:2019-03-01

本文共 3311 字,大约阅读时间需要 11 分钟。

Java NIO(非阻塞输入输出)详解

Java NIO(Non-Blocking Input/Output)是Java平台提供的一套用于高效处理输入输出操作的新API,自JDK 1.4起开始提供,旨在替代传统的Blocking I/O(BIO),特别适用于网络编程和文件操作,能够显著提升性能和吞吐量。


Java NIO的核心特点

Java NIO的核心特点在于其非阻塞(Non-Blocking)特性。传统的BIO(Blocking I/O)模式中,IO操作是阻塞的,即一旦等待IO完成,就会阻塞当前线程,无法进行其他操作。而NIO引入了非阻塞模式,通过 Selector(选择器)和 Channel(通道)实现多线程、多任务处理的高效IO操作。

NIO的核心组件包括 Channel(通道)、Buffer(缓冲区)和 Selector(选择器)


NIO与BIO的主要区别

特性 BIO NIO
IO模式 阻塞 非阻塞
数据处理
优点 灵活性不高 灵活性高,支持大规模并发
适用场景 单线程、高负载场景不适合 多线程、高并发场景优选

Buffer(缓冲区)

缓冲区是NIO的核心组件之一,用于临时存储数据块。NIO的缓冲区实现分为多个类型,包括:

  • ByteBuffer:用于存储字节数据。
  • CharBuffer:用于存储字符数据。
  • ShortBuffer、IntBuffer、LongBuffer、DoubleBuffer、FloatBuffer:分别用于存储不同数据类型。

缓冲区提供了灵活的读写操作,支持双向读写(通过 flip() 方法切换读写模式)。


Channel(通道)

通道是NIO中用于读取和写入数据的核心接口。常见的Channel实现包括:

  • FileChannel:用于文件操作。
  • DatagramChannel:用于UDP网络通信。
  • ServerSocketChannelSocketChannel:用于TCP网络通信。

通道支持异步读写操作,数据可以直接从或到缓冲区处理,避免了传统BIO中频繁的数据拷贝,提高了效率。


Selector(选择器)

选择器的作用是管理多个通道的事件处理。一个选择器可以管理多个通道(Channel),通过线程轮询这些通道是否有可读或可写事件发生。一旦有事件发生,选择器会通知相应的通道,进行数据读写操作。

Selector的常用方法包括:

  • open():获取选择器实例。
  • select(long timeout):阻塞或非阻塞地等待事件发生。
  • selectedKeys():获取已触发事件的选择键集合。

NIO非阻塞网络编程流程

服务端流程

  • 创建 ServerSocketChannel 并绑定端口。
  • ServerSocketChannel 注册到选择器,关注连接事件(SelectionKey.OP_ACCEPT)。
  • 进入选择器的阻塞模式,等待客户端连接。
  • 当有连接事件发生时,获取新的 SocketChannel 并将其注册到选择器,关注读写事件。
  • 客户端流程

  • 创建 SocketChannel 并配置非阻塞模式。
  • 连接到服务端地址。
  • 发送数据到服务端,数据通过缓冲区(ByteBuffer)处理。
  • 服务端接收数据,通过选择器分发给相应的通道进行处理。

  • 示例代码

    以下是NIO非阻塞网络编程的典型示例:

    服务端

    public class NIOServer {    public static void main(String[] args) throws Exception {        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();        Selector selector = Selector.open();        InetSocketAddress inetSocketAddress = new InetSocketAddress(6666);        serverSocketChannel.socket().bind(inetSocketAddress);        serverSocketChannel.configureBlocking(false);        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);        while (true) {            int selected = selector.select(1000);            if (selected == 0) {                continue;            }            Set
    selectionKeys = selector.selectedKeys(); Iterator
    keyIterator = selectionKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey selectionKey = keyIterator.next(); if (selectionKey.isAcceptable()) { SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024)); } keyIterator.remove(); } } }}

    客户端

    public class NIOClient {    public static void main(String[] args) throws Exception {        SocketChannel socketChannel = SocketChannel.open();        socketChannel.configureBlocking(false);        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 6666);        if (!socketChannel.connect(inetSocketAddress)) {            while (!socketChannel.finishConnect()) {                System.out.println("Connecting to server...");            }        }        ByteBuffer buffer = ByteBuffer.wrap("Hello, World!".getBytes());        socketChannel.write(buffer);        System.in.read();    }}

    总结

    Java NIO通过引入非阻塞模型、缓冲区和选择器,显著提升了IO操作的效率,特别适用于高并发和大规模数据处理场景。在实际应用中,NIO的选择器和通道机制能够有效管理多线程和多任务,优化了系统性能。通过合理使用缓冲区和通道,开发者可以实现更高效的数据读写操作。

    转载地址:http://dyxo.baihongyu.com/

    你可能感兴趣的文章
    SQL-36 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。
    查看>>
    ORM sqlachemy学习
    查看>>
    Ormlite数据库
    查看>>
    orm总结
    查看>>
    os.environ 没有设置环境变量
    查看>>
    os.path.join、dirname、splitext、split、makedirs、getcwd、listdir、sep等的用法
    查看>>
    os.system 在 Python 中不起作用
    查看>>
    OS2ATC2017:阿里研究员林昊畅谈操作系统创新与挑战
    查看>>
    OSCACHE介绍
    查看>>
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周五乱弹 ——吹牛扯淡的耽误你们学习进步了
    查看>>
    SQL--mysql索引
    查看>>
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
    查看>>
    OSGi与Maven、Eclipse PlugIn的区别
    查看>>
    Osgi环境配置
    查看>>
    OSG——选取和拖拽
    查看>>
    OSG中找到特定节点的方法(转)
    查看>>