【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方法,

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

相关文章
|
3天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
8 0
|
3天前
|
Java
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
6 0
|
9天前
|
Java 编译器 程序员
Java基础语法之基本语法格式
本文主要复习了Java的基础语法,包括类的定义、方法、主方法、注释和关键字等内容,旨在帮助读者巩固Java学习中的重要概念。
|
14天前
|
存储 Java 程序员
JAVA基本语法
JAVA基本语法
18 1
|
19天前
|
存储 Java
Java入门&基础语法
Java入门&基础语法
|
19天前
|
Java 程序员 编译器
JavaSE&Java8 Lambda 表达式
JavaSE&Java8 Lambda 表达式
|
19天前
|
存储 Java 程序员
JavaSE&Java的异常
JavaSE&Java的异常
26 0
|
19天前
|
存储 Java 程序员
Java从入门到精通:1.1.1了解Java基础知识:学习Java的基本语法
Java从入门到精通:1.1.1了解Java基础知识:学习Java的基本语法
|
19天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
17 1
|
20天前
|
存储 安全 Java
滚雪球学Java(19):JavaSE中的内存管理:你所不知道的秘密
【4月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
40 4
滚雪球学Java(19):JavaSE中的内存管理:你所不知道的秘密