Java NIO 系列教程(一)

概述

Java NIO是面向缓冲区的,基于通道的IO操作。

缓冲区与通道的基本原理叙述

通道:类似于生活中的铁路,只用于连接,并没有数据的传输。

这里写图片描述

缓冲区:类似于火车,可以双向的传递数据,比如说:运城到太原的火车,在运城上乘客后(乘客数量小于火车容量)(可以认为就是在写数据),就可以往太原出发,(当然也可以在中途进行上下车)在太原后,乘客需要下车(类似于读数据),重要的是这个火车在太原可以再次进行装人(写数据),并将人运输到运城,以此类推。。。可知缓冲区是双向的存取。

这里写图片描述

由以上可知,在Java NIO中,由Channel面向传输,Buffer面向存储。

Java 缓冲区操作

  1. 负责存取数据,缓冲区就是数组,用于存储不同类型的数据,java根据数据类型的不同(Boolean类型除外),提供了相应的缓冲区。

    • ByteBuffer
    • CharBuffer
    • IntBuffer
    • ShortBuffer
    • LongBuffer
    • DoubleBuffer

以上数据类型都可以通过allocate()来获取缓冲区。

//创建缓冲区,分配一个指定大小(10)的缓冲区
ByteBuffer buf = ByteBuffer.allocate(10);
  1. 缓冲区:存取数据的核心方法包括两种

    • put:存取数据到缓冲区
    • get:获取缓冲区中的数据
  2. 四个主要核心属性:

    • capacity:容量,表示缓冲区最大的存储量,一旦声明不能改变。
    • limit:界限,表示缓冲区中可以操作数据的大小(limit后的数据不能进行操作)
    • position:位置,表示缓冲区正在操作的数据的位置。
    • 关系:position<=limit<=capacity
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

输出:0,10,10

图解:

这里写图片描述

//利用put方法,存入数据到缓冲区
String str = "abcde";
buf.put(str.getBytes());
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

输出:5,10,10

图解:

这里写图片描述

//利用flip()方法,改变缓冲区模式将缓冲区从写模式改变为读模式
buf.flip();
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

输出:0.10.5

图解:

这里写图片描述

//利用get方法读取数据
byte [] bytes = new byte[buf.limit()];
buf.get(bytes);
System.out.println(new String(bytes));

输出:abcde

图解:

这里写图片描述

//清空缓冲区,使缓冲区回到最初的状态,数据并没有清除,只是处于“被遗忘”状态
buf.clear();
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());

输出:0,10,10

这里写图片描述

//利用get方法来验证被遗忘的数据
System.out.println((char)buf.get());

输出:a

前面提及是四个核心属性,上面只涉及前三个比较重要的属性,现在来说明最后一个不是很重要的属性。

  • Mark可以记录当前position的位置,可以通过reset函数回到mark标记的位置。
String str = "abcde";
// 申请大小为10的缓冲区
ByteBuffer buf = ByteBuffer.allocate(10);
// 将数据存入缓冲区
buf.put(str.getBytes());
buf.flip();
byte[] bytes = new byte[buf.limit()];   buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));    buf.mark();
buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));
buf.reset();
buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));

输出:ab cd cd

图解:

申请:

这里写图片描述

存入数据:

这里写图片描述

读取数据:

这里写图片描述

mark标记:

这里写图片描述

读取数据:

这里写图片描述

reset:

这里写图片描述

读取数据:

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NobiGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值