ToB企服应用市场:ToB评测及商务社交产业平台

标题: 深入探索 Java NIO:从基础到实战应用 [打印本页]

作者: tsx81429    时间: 7 天前
标题: 深入探索 Java NIO:从基础到实战应用
接待来到我的【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 的方式如下:
  1. // 创建一个容量为1024的ByteBuffer
  2. ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
复制代码
这里的allocate方法会在堆内存中分配一块指定巨细的连续空间用于存储数据。别的,另有allocateDirect方法,它会尝试在直接内存(Direct Memory)中分配缓冲区,直接内存不受 Java 堆内存巨细限制,在一些对性能要求极高的场景,如大数据量的网络传输或文件读写,使用直接缓冲区能减少一次数据从堆内存到直接内存的复制操作,从而提升性能,但创建和销毁直接缓冲区的开销相对较大。
可以向缓冲区写入数据,然后切换到读模式举行读取:
  1. // 写入数据
  2. byteBuffer.put("Hello, NIO!".getBytes());
  3. // 切换到读模式
  4. byteBuffer.flip();
  5. // 读取数据
  6. byte[] bytes = new byte[byteBuffer.remaining()];
  7. byteBuffer.get(bytes);
  8. String result = new String(bytes);
  9. System.out.println(result);
复制代码
通道(Channel)

通道是 NIO 中举行数据传输的通道,它与流的不同之处在于通道可以举行双向数据传输,并且支持异步操作。常见的通道范例有 FileChannel、SocketChannel、ServerSocketChannel 等。下面是一个使用 FileChannel 读取文件的简朴示例:
  1. try (FileInputStream fis = new FileInputStream("test.txt");
  2.      FileChannel fileChannel = fis.getChannel()) {
  3.     ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
  4.     int bytesRead = fileChannel.read(byteBuffer);
  5.     while (bytesRead != -1) {
  6.         byteBuffer.flip();
  7.         while (byteBuffer.hasRemaining()) {
  8.             System.out.print((char) byteBuffer.get());
  9.       
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4