Java NIO概述

简介: IO与NIO的区别 IO是面向流的,而NIO是面向块(缓冲区)的。面向块的方式中,一次性可以获取或者写入一整块数据,而不需要一个字节一个字节的从流中读取。面向块的方式处理数据的速度会比流方式更快。 NIO基础 通道 Channel与缓冲器Buffer Buffer是一个保存数据的地方,包括刚刚写入的数据,以及被读取的数据,主要用来追踪系统的读写进程。

IO与NIO的区别

IO是面向流的,而NIO是面向块(缓冲区)的。面向块的方式中,一次性可以获取或者写入一整块数据,而不需要一个字节一个字节的从流中读取。面向块的方式处理数据的速度会比流方式更快。

NIO基础

通道 Channel与缓冲器Buffer

Buffer是一个保存数据的地方,包括刚刚写入的数据,以及被读取的数据,主要用来追踪系统的读写进程。

Channel与流模式比较类似,但是,永远无法将数据直接写入到Channel或者从Channel中读取数据。需要通过Buffer与Channel交互。

NIO的读与写

读取

第一步,获取通道

FileInputStream inputStream = new FileInputStream("read.txt");
FileChannel inputChannel = inputStream.getChannel();

第二步,创建缓冲器

ByteBuffer buffer = ByteBuffer.allocate(1024);

第三步,将channel中的数据读取到buffer中。相当于写入buffer

int readBytes = inputChannel.read(buffer);

写入

将数据写入到buffer中,然后再将buffer中的数据写入到channel中

FileOutputStream outputStream = new FileOutputStream("output.txt");
FileChannel outputChannel = inputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(new String("message").getBytes());
buffer.filp();
outputChannel.write(buffer);

Buffer细节

Buffer
通过 position, limit, capacity 可以控制读取和写入的数据。

以下均为伪代码:

put方法

bytes[postion++] = c;

flip方法:

limit = position;
position = 0;

get方法:

byte c = bytes[position++];

clear方法:

position = 0;
limit = capacity;

选择器 Selector

Selector 就是您注册对各种 I/O 事件的兴趣的地方,而且当那些事件发生时,就是这个对象告诉您所发生的事件。

以下我们看一下服务端如何将channel感兴趣的事件绑定在selector上。

        // 获得一个ServerSocket通道
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        // 设置通道为非阻塞
        serverChannel.configureBlocking(false);
        // 将该通道对应的ServerSocket绑定到port端口
        serverChannel.socket().bind(new InetSocketAddress(port));
        // 获得一个通道管理器
        Selector selector = Selector.open();
        //将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后,
        //当该事件到达时,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞。
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);

内部循环:
现在我们已经将感兴趣的IO事件注册到selector上,下面将进入主循环:

int num = selector.select();

Set selectedKeys = selector.selectedKeys();
Iterator it = selectedKeys.iterator();

while (it.hasNext()) {
     SelectionKey key = (SelectionKey)it.next();
     // ... deal with I/O event ...
}

这样,当时select返回时,channel中已经可以read或者write了。

总结

选择器selector 将 通道channel感兴趣的IO事件注册监听,当其返回时,channel即可对这些IO事件进行处理,一般将这些读写操作都会放到单独的线程中执行,提高吞吐率。

参考文献:
IBM Java NIO入门

目录
相关文章
|
4月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
19天前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
1月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
31 2
|
2月前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
2月前
|
安全 Java API
Java 18 概述:新特性一览
Java 18 作为 Java 平台的最新版本,引入了多项令人振奋的新特性和改进,包括模式匹配、记录类型、流库改进、外部函数与内存 API 以及并发处理增强。这些新功能不仅提升了开发者的生产力,还显著增强了 Java 的性能和安全性。本文将详细介绍 Java 18 的主要新特性,并通过代码示例帮助读者更好地理解和应用这些功能。
|
3月前
|
存储 Oracle Java
01 Java概述基础与计算机基础(DOS+进制+原码反码补码)
01 Java概述基础与计算机基础(DOS+进制+原码反码补码)
43 17
|
3月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
89 2
|
3月前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
69 8
|
3月前
|
Java 数据安全/隐私保护
09 Java面向对象三大特征(概述)
09 Java面向对象三大特征(概述)
70 4
|
3月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
121 0
下一篇
无影云桌面