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

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

接待来到我的【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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表