接待来到我的【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 的方式如下:
- // 创建一个容量为1024的ByteBuffer
- ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
复制代码 这里的allocate方法会在堆内存中分配一块指定巨细的连续空间用于存储数据。别的,另有allocateDirect方法,它会尝试在直接内存(Direct Memory)中分配缓冲区,直接内存不受 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 读取文件的简朴示例:
- 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());
-
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |