声明:原创文章,转载请注明出处。http://www.jianshu.com/u/e02df63eaa87
1、概述
Java BIO(标准IO)中, 提供了基于流的IO实现,即Inputstream和Outputstream。也就是已字节为单位处理数据。
Java NIO是Java New IO的简称,是一套新的完全可以替代Java IO的机制。与BIO不同的是,NIO是基于块(Block)实现的,以块为基本单位处理数据。
除此之外,NIO还加入了以下特性:
- Buffer:为所有的基本数据类型提供了Buffer支持
- Charset:使用Java.nio.charset.Charset 作为字符集编码方案
- Channel:增加Channel作为新的原始IO接口
- 锁、内存映射:增加锁和内存映射的文件访问接口
- selector:提供了基于selector的异步网络IO
Buffer是一块连续的内存块,是NIO读写数据的中转地。
Channel是缓冲数据的源头或目的地,用于向缓冲读取/写入数据,是访问Buffer的接口。
2、Channel和Buffer
NIO中,Buffer为一个抽象类。并为每个基本数据类型创建了一个Buffer。除了ByteBuffer之外,其他基本类型的Buffer,都有完全相同的成员方法和操作。是由于ByteBuffer多用于大部分BIO操作的接口,具有一些特殊的方法。
NIO中,配合Buffer使用的有Channel。Channel与Stream最大的不同是,Channel是一个双向通道。使用NIO中,Channel不能单独使用,必须通过配合Buffer使用。例如,在对一个Channel进行读操作时,首先将数据从Channel写入到相应的Buffer中,之后在Buffer中进行读取。
public static void readAndWriteFile(String src, String dst) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dst);
FileChannel readChannel = fis.getChannel();
FileChannel writeChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024); // 1KB
while (true) {
buffer.clear();
int readLen = readChannel.read(buffer);
if (readLen == -1) {
break;
}
buffer.flip();
writeChannel.write(buffer);
}
readChannel.close();
writeChannel.close();
}
上例是一个简单的使用NIO读取并写入的操作。可以看到,读取文件时,打开文件并获取文件的Channel,并将数据读入到空的Buffer中;同样地写入时,需要将有数据的Buffer写入到Channel中。对Channel进行读写操作时,都需要Buffer的配合。