1、为什么要使用NIO?(New IO)
NIO是JDK1.4加入的新包,NIO的创建目的是为了让java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的
I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。
2、流与块的比较
原来的I/O库(在java.io.*中)与NIO最重要的区别是数据打包和传输的方式,原来的I/O以流的方式处理数据,而NIO与块的方式处理
数据。
面向流的I/O系统一次一个字节地处理数据。一个输入流差生一个字节的数据,一个输出流消费一个字节的数据。不利的一面是,
面向流的I/O通常相当慢。
一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一数据块。按块处理数据比按(流)字节处理数据
要快得多。但是面向快的I/O缺少一些面向流的I/O所具有的的优雅性和简单性。
3、缓冲区
在NIO库中,所有的数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中
的。任何时候访问NIO中的数据,都是将它放到缓冲区中。
缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲
区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
4、缓冲区类型
最常用的缓冲区类型是ByteBuffer。一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。ByteBuffer不
是NIO中唯一的缓冲区类型。每一种基本java类型都有一种缓冲区类型:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
import java.nio.Buffer;
import java.nio.ByteBuffer;
public class newioDemo {
public static void main(String[] args) {
//创建一个字节缓冲区,申请内存空间 8 字节
ByteBuffer buf = ByteBuffer.allocate(8);
System.out.println("positon="+buf.position()); //position表示位置
System.out.println("limit="+buf.limit()); //limit表示限制的空间大小,通常和capacity的大小一致
System.out.println("capacity="+buf.capacity()); //capacity表示内存空间大小
/**
positon=0
limit=8
capacity=8
*/
//向缓冲区中写入数据
buf.put((byte)10);
buf.put((byte)20);
buf.put((byte)30);
buf.put((byte)40);
System.out.println("positon="+buf.position());
System.out.println("limit="+buf.limit());
System.out.println("capacity="+buf.capacity());
/**
* positon=4
limit=8
capacity=8
*/
//缓冲区翻转;作用:是将缓冲区里没有用到的空间暂时去掉,这样取值时就不会取到未用到空间的空值
buf.flip();
/**
* flip()的实现就是如下:
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
*/
System.out.println("positon="+buf.position());
System.out.println("limit="+buf.limit());
System.out.println("capacity="+buf.capacity());
/**
positon=0
limit=4
capacity=8
*/
//取值
//buf.hasRemaining() 告诉当前位置和极限之间是否存在任何元素;boolean值
if(buf.hasRemaining()) {
//buf.remaining() 返回当前位置和限制之间的元素数
for(int i=0;i<buf.remaining();i++) {
byte b = buf.get(i);
System.out.println(b);
}
}
}
}