一、NIO与IO的区别
1.NIO是在IO的基础上进行改进,NIO是一个可以替代标准IO API的API(从Java 1.4开始),NIO提供了与标准IO不同的IO工作方式。
2.NIO是一个非阻塞的IO(通道+缓冲区),面向缓冲区的,而IO是阻塞的,面向流。
二、代码测试
1.BufferTest.java
/**
* 缓冲区是NIO 提高给传输文件和通道一起配合使用,存储数据.<br>
* Buffer<br>
* ByteBuffer<br>
* LongBuffer<br>
* InteigBuffer<br>
* FloatBuffer<br>
* DubboBuffer<br>
*
* Created by ChenMingXu on 2019/6/1.
*/
public class BufferTest {
/**
* position<br> 缓冲区正在操作的位置 默认从0开始。
* limit<br> 界面(缓冲区可用大小)
* capacity;<br> 缓冲区最大容量,一旦声明不能改变
*
* 核心方法:
* put() 往buff存放数据
* get() 获取数据
*
* */
public static void main(String[] args) {
//初始化byteBuffer的大小
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
System.out.println(byteBuffer.position());
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("----------往bytebuff存放数据....----------");
byteBuffer.put("abcd1".getBytes());
System.out.println(byteBuffer.position());
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
System.out.println("----------读取值...----------");
//开启读取模式,把position的值置为0,然后往后面循环读取,没有值就不读取了
//byteBuffer.flip();
System.out.println("position:"+byteBuffer.position());
System.out.println(byteBuffer.limit());
System.out.println(byteBuffer.capacity());
byte[] bytes= new byte[byteBuffer.limit()];
byteBuffer.get(bytes); //43行
System.out.println(new String(bytes,0,bytes.length));
}
}
1.1.测试结果(上面的代码注释掉,就会保下面的错)
0
1024
1024
----------往bytebuff存放数据....----------
5
1024
1024
----------读取值...----------
position:5
1024
1024
Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:151)
at java.nio.ByteBuffer.get(ByteBuffer.java:715)
at com.ysfj.BufferTest.main(BufferTest.java:43)
1.2.注释打开之后的结果
0
1024
1024
----------往bytebuff存放数据....----------
5
1024
1024
----------读取值...----------
position:0
5
1024
abcd1