最近在学习Android,看到了一个概念NIO。于是小小的研究了下。
NIO是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据库,按块处理要比按字节处理数据快的多。
NIO有三个核心对象:缓冲区(Buffer)、通道(Channel)、选择器(Selector)
一、缓冲区Buffer
所有的缓冲区类型都继承于抽象类Buffer,最常用的就是ByteBuffer
例子:
public static void bufferTest() {
// 分配新的int缓冲区,参数为缓冲区容量
// 新缓冲区的当前位置将为零,其界限(限制位置)将为其容量。它将具有一个底层实现数组,其数组偏移量将为零。
IntBuffer buffer = IntBuffer.allocate(8);
for (int i = 0; i < buffer.capacity(); ++i) {
int j = 2 * (i + 1);
// 将给定整数写入此缓冲区的当前位置,当前位置递增
buffer.put(j);
}
// 重设此缓冲区,将限制设置为当前位置,然后将当前位置设置为0
buffer.flip();
// 查看在当前位置和限制位置之间是否有元素
while (buffer.hasRemaining()) {
// 读取此缓冲区当前位置的整数,然后当前位置递增
int j = buffer.get();
System.out.print(j + " ");
}
}
二、通道Channel
通道是一个对象,通过它可以读取和写入数据
1.使用NIO读取数据
步骤: 1. 从FileInputStream获取Channel 2. 创建Buffer 3. 将数据从Channel读取到Buffer中
public static void NIOReadTest() throws IOException {
@SuppressWarnings("resource")
FileInputStream fin = new FileInputStream("/Users/apple/Documents/test.txt");
// 获取通道
FileChannel fc = fin.getChannel();
// 创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 读取数据到缓冲区
fc.read(buffer);
buffer.flip();
while (buffer.remaining()>0) {
byte b = buffer.get();
System.out.print(((char)b));
}
fin.close();
}
2.使用NIO写入数据
步骤: 1. 从FileInputStream获取Channel 2. 创建Buffer 3. 将数据从Channel写入到Buffer中
public static void NIOInputTest() throws IOException {
final byte message[] = { 83, 111, 109, 101, 32,
98, 121, 116, 101, 115, 46 };
@SuppressWarnings("resource")
FileOutputStream fout = new FileOutputStream( "/Users/apple/Documents/test.txt" );
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
for (int i=0; i<message.length; ++i) {
buffer.put( message[i] );
}
buffer.flip();
fc.write( buffer );
fout.close();
}
今天就把基本用法简述一下,明天看下内部实现