【JavaSE】Java基础语法(四十二):NIO

简介: 1. 概述BIOBlocking IO,阻塞型IONIONo Blocking IO,非阻塞型IO阻塞IO的弊端在等待的过程中,什么事也做不了非阻塞IO的好处不需要一直等待,当一切就绪了再去做

1. 概述

  • BIO
    Blocking IO,阻塞型IO
  • NIO
    No Blocking IO,非阻塞型IO
  • 阻塞IO的弊端
    在等待的过程中,什么事也做不了
  • 非阻塞IO的好处
    不需要一直等待,当一切就绪了再去做

2. NIO与BIO的区别

  • 区别一
    BIO是阻塞的,NIO是非阻塞的
  • 区别二
    BIO是面向流的,NIO是面向缓冲区的
    BIO中数据传输是单向的,NIO中的缓冲区是双向的

3. NIO三大模块

  • 缓冲区
    用来存储数据
  • 通道
    用来建立连接和传输数据
  • 选择器
    监视通道状态


36166d86b265481cb94b0430c68d1738.png

4. NIO创建缓冲区对象【应用】

  • 方法介绍


1b01c3e7bf7f49149563c58c33e6dd73.png

代码示例

public class CreateByteBufferDemo1 {
  public static void main(String[] args) {
    //method1();
    //method2();
    ByteBuffer wrap = ByteBuffer.wrap("aaa".getBytes());
    for (int i = 0; i < 3; i++) {
      System.out.println(wrap.get());
    }
  }
  private static void method2() {
    byte [] bytes = {97,98,99};
    ByteBuffer byteBuffer2 = ByteBuffer.wrap(bytes);
    //缓冲区的长度3
    //缓冲区里面的内容就是字节数组的内容.
    for (int i = 0; i < 3; i++) {
      System.out.println(byteBuffer2.get());
    }
    System.out.println(byteBuffer2.get());
  }
  private static void method1() {
    ByteBuffer byteBuffer1 = ByteBuffer.allocate(5);
    //get
    for (int i = 0; i < 5; i++) {
      System.out.println(byteBuffer1.get());
    }
    System.out.println(byteBuffer1.get());
  }
}

5. NIO缓冲区添加数据【应用】

  • 方法介绍

006a30395d4f40ba83e1824ab0bc5c2f.png

代码示例

public class ByteBufferDemo2 {
  public static void main(String[] args) {
    // int position() 当前要操作的索引
    // int limit() 最多能操作到哪个索引
    // int capacity() 缓冲区的总长度
    ByteBuffer byteBuffer = ByteBuffer.allocate(10);
    System.out.println(byteBuffer.position());//0
    System.out.println(byteBuffer.limit());//10
    System.out.println(byteBuffer.capacity());//10
    // put(byte b) 一次添加一个字节
    // byteBuffer.put((byte) 97);
    // System.out.println(byteBuffer.position());
    // System.out.println(byteBuffer.limit());
    // System.out.println(byteBuffer.capacity());
    // put(byte[] src) 一次添加一个字节数组
    // byteBuffer.put("aaa".getBytes());
    // System.out.println(byteBuffer.position());//3
    // System.out.println(byteBuffer.limit());//10
    // System.out.println(byteBuffer.capacity());//10
    // position(int newPosition) 修改position
    // byteBuffer.position(1);
    // limit(int newLimit) 修改limit
    // byteBuffer.limit(5);
    // System.out.println(byteBuffer.position());
    // System.out.println(byteBuffer.limit());
    // System.out.println(byteBuffer.capacity());
    // int remaining() 还有多少能操作
    // boolean hasRemaining() 是否还有能操作的
    byteBuffer.put("0123456789".getBytes());
    System.out.println(byteBuffer.remaining());
    System.out.println(byteBuffer.hasRemaining());
  }
}

6. NIO缓冲区获取数据【应用】

  • 方法介绍

176106096ac44b66ba37525456b39c8f.png

  • 代码示例
public class ByteBufferDemo3 {
  public static void main(String[] args) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(10);
    byteBuffer.put("abc".getBytes());
    // flip() 切换读写模式(写读)
    byteBuffer.flip();
    // get() 读一个字节
    // while(byteBuffer.limit() != byteBuffer.position()){
    // System.out.println((char) byteBuffer.get());
    // }
    for (int i = 0; i < byteBuffer.limit(); i++) {
    System.out.println((char) byteBuffer.get());
    }
    // get(byte[] dst) 读多个字节
    // byte [] bytes = new byte[byteBuffer.limit()];
    // byteBuffer.get(bytes);
    // System.out.println(new String(bytes));
    // get(int index) 读指定索引的字节
    // System.out.println((char) byteBuffer.get(0));
    // rewind() 将position设置为0,可以重复读
    // byteBuffer.rewind();
    // for (int i = 0; i < byteBuffer.limit(); i++) {
    // System.out.println((char) byteBuffer.get());
    // }
    // clear() 数据读写完毕(读->写)
    byteBuffer.clear();
    byteBuffer.put("qqq".getBytes());
    // array() 将缓冲区转换成字节数组返回
    byte[] bytes = byteBuffer.array();
    System.out.println(new String(bytes));
  }
}

7. 小结

1. 需求:我要把数据写到缓冲区中。

数据是从外面进入到缓冲区的,所以缓冲区在做读数据的操作。

2. 需求:我要把数据从缓冲区中读出来。

数据是从缓冲区里面到外面的。所以缓冲区在做写数据的操作。


3. capacity:容量(长度)

limit: 界限(最多能读/写到哪里)

posotion:位置(读/写哪个索引)


获取缓冲区里面数据之前,需要调用flip方法


再次写数据之前,需要调用clear方法,

但是数据还未消失,等再次写入数据,被覆盖了才会消失。

相关文章
|
2月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
64 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
50 1
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
35 2
|
5天前
|
存储 监控 Java
Java的NIO体系
通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
23 5
|
20天前
|
Java
java do while 的语法怎么用?
java do while 的语法怎么用?
34 3
|
1月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
31 1
|
2月前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
30 1
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
Kotlin语法笔记(28) -Kotlin 与 Java 混编
33 2
|
2月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
59 3
下一篇
DataWorks