IO:基于数据流Stream,所有数据都是字节流。
NIO:基于数据块Block,NIO把最耗时是填充和提取缓冲区转到操作系统,从而极大的提升性能。
NIO组成:通道Chanel和缓冲区Buffer。
数据的读写通过Chanel进行,Chanel相对于Stream,但是程序不能直接操作Chanel,而是通过Buffer和Chanel交互。Buffer实质上是一个数组。
Stream是单向的数据流,分InputStream和OutputSteam,Chanel是双向的。
读文件:
1、从FileInputStream中获取Chanel。FileChanel fc = fis.getChanel();
2、创建Buffer,Buffer buffer = Buffer.allocate(1024);
3、从Chanel读取数据到缓冲区,fc.read(buffer);
写文件:
FileOutputStream fout = new FileOutputStream( "writesomebytes.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 );
缓冲区Buffer细节:
缓冲区维护了3个变量:
1、position:当前读写的位置。
2、limit:写数据时:还有多少数据可以写入;读数据时:还有多少剩余空间。
3、capacity:Buffer总长度。
flip()方法:把limit设置为当前position,把position设置为0.
clear()方法:清除Buffer数据,重置position和limit。
直接操作Buffer方法:get方法,5个重载;put方法,5个重载。
数组可以直接wrap为缓冲区。
内存映射文件IO:通过OS的文件内存映射功能,把内存和磁盘文件直接做映射。
异步IO:一种无阻塞的读写数据的方法。传统IO的read和write方法会导致IO堵塞。NIO通过注册事件监听,达到IO无阻塞。
异步IO核心:Selector对象,通过Selector对象注册事件,事件发生时,由Selector对象通知。
异步 I/O 和直接缓冲区