深入探索 Java NIO:从基础到实战应用

server/2025/2/26 21:36:15/
 🚀欢迎来到我的【Java高级】专栏🚀
  • 🙋我是小蜗,一名在职牛马。
  • 🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页
  • 🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏

🌍前言

揭开 Java NIO 的神秘面纱,开启高效编程之旅

Java NIO(New I/O)是在 Java 1.4 版本中引入的一套新的 I/O API,它提供了与传统 I/O 不同的异步、非阻塞式的 I/O 操作方式,大大提高了 I/O 处理的效率和性能。传统 I/O 基于流(Stream),数据像水流一样单向顺序读取或写入,且读写操作会阻塞线程;而 NIO 基于缓冲区和通道,能以更灵活的方式处理数据,减少线程阻塞,提升并发处理能力。

🌍目录

 

🌍JavaNIO

缓冲区(Buffer)

通道(Channel)

选择器(Selector)

实现一个最简单的聊天系统

服务器端代码

客户端代码


🌍JavaNIO

缓冲区(Buffer)

缓冲区是 NIO 中数据的载体,所有数据都通过缓冲区来处理。常见的缓冲区类型有 ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 和 DoubleBuffer。以 ByteBuffer 为例,创建一个 ByteBuffer 的方式如下:

java">// 创建一个容量为1024的ByteBuffer
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

这里的allocate方法会在堆内存中分配一块指定大小的连续空间用于存储数据。此外,还有allocateDirect方法,它会尝试在直接内存(Direct Memory)中分配缓冲区,直接内存不受 Java 堆内存大小限制,在一些对性能要求极高的场景,如大数据量的网络传输或文件读写,使用直接缓冲区能减少一次数据从堆内存到直接内存的复制操作,从而提升性能,但创建和销毁直接缓冲区的开销相对较大。

可以向缓冲区写入数据,然后切换到读模式进行读取:

java">// 写入数据
byteBuffer.put("Hello, NIO!".getBytes());
// 切换到读模式
byteBuffer.flip();
// 读取数据
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
String result = new String(bytes);
System.out.println(result);
通道(Channel)

通道是 NIO 中进行数据传输的通道,它与流的不同之处在于通道可以进行双向数据传输,并且支持异步操作。常见的通道类型有 FileChannel、SocketChannel、ServerSocketChannel 等。下面是一个使用 FileChannel 读取文件的简单示例:

java">try (FileInputStream fis = new FileInputStream("test.txt");FileChannel fileChannel = fis.getChannel()) {ByteBuffer byteBuffer = ByteBuffer.allocate(1024);int bytesRead = fileChannel.read(byteBuffer);while (bytesRead != -1) {byteBuffer.flip();while (byteBuffer.hasRemaining()) {System.out.print((char) byteBuffer.get());

http://www.ppmy.cn/server/170850.html

相关文章

什么是HTTP/2协议?NGINX如何支持HTTP/2并提升网站性能?

HTTP/2是一种用于在Web浏览器和服务器之间进行通信的协议,旨在提高网站性能和加载速度。它是HTTP/1.1的继任者,引入了许多优化和改进,以适应现代Web应用的需求。HTTP/2的主要目标是减少延迟、提高效率,以及更好地支持并发请求。 …

DeepSeek “源神”启动!「GitHub 热点速览」

上周,DeepSeek 官方宣布将陆续发布 5 个开源项目。本周一开源社区就迎来了首发之作——FlashMLA!该项目开源后,不到一天 Star 数已突破 6k,并且还在以惊人的速度持续飙升。 GitHub 地址:github.com/deepseek-ai/FlashM…

python与C系列语言的差异总结(4)

如果具有传统编译型语言的经验,大家可能会对是否使用字典而犹豫不决,担心字典的效率比列表或数组低。事实上Python字典的执行速度已经相当快了。Python语言的许多内部特性都依赖于字典,为提高字典的效率已经投入了大量的心血。Python的所有数…

C#基础总结:常用的数据结构

Array: 需要处理的元素数量确定并且需要使用下标时可以考虑,不过建议使用List 数组的内容都是相同类型 数组可以直接通过下标访问 创建时需要固定数组大小 int size 5; int [] test new int [size]; string [] test2 new string [3]; //赋值 t…

2024大模型技术全景解构:从开源生态到商业落地的深度博弈

大模型技术调研报告 一、开源大模型概览 模型名称开发公司/机构技术架构参数规模开源协议特点与应用场景LLaMA 3Meta (Facebook)Transformer (Decoder-only)8B、70B、400B需申请商用许可支持多语言,长上下文(128K token),优化推…

吃一堑长一智

工作中经历,有感触记录下 故事一 以前在一家公司时,自己是一名开发人员,遇到问题请教领导解决方案,当时领导给了建议,后来上线后出问题了,背了锅。心里想的是领导说这样做的呀,为什么出问题还…

23贪心算法

分发饼干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {int i0,j0;int count0;sort(s.begin(),s.end());sort(g.begin(),g.end());while(i<g.size()&&j<s.size()){if(g[i]<s[j]){i;j;count;}else…

android中的CheckBox改变背景图片显示大小

在androidStudio的xml文件设置布局时&#xff0c;对于checkBox选中后&#xff0c;展示大小不同的背景图片 1.首先需要一个选择器存放背景图片&#xff0c;设置选中和未选中状态 <?xml version"1.0" encoding"utf-8"?> <selector xmlns:androi…