NIO与IO流

来源:互联网 发布:linux 查看服务列表 编辑:程序博客网 时间:2024/06/07 14:43
NIO与IO
流与块的比较:
最大的区别在于数据的打包和传输方式,IO是以流的方式处理数据,而NIO是以块的方式处理数据
面向流的IO一个输出流产生一个字节,一个输入流消费一个字节,面向流的处理通常很慢。
面向块的IO系统是以块的形式处理数据,每一个操作都产生或消费一个数据块,,块比流的速度快很多。

BUffer(缓冲区)和Channel(通道)是NIO中核心的对象,(网络NIO中还有一个selector(选择器)核心对象),几乎每一个IO操作都会用到她们,
channel(通道)是对原IO中的模拟,任何来源和目的的数据都必须通过一个channel(通道)对象,一个Buffer实质上是一个容器对象,发给channel的所有对象都必须先放到Buffer 中,从channel中读取数据也都要读到Buffer中。
Buffer是一个对象,它包含了一些要写入或者要读出的数据,,在NIO中,数据是放在Buffer对象中的,在IO中,数据是直接写入或者读到Stream对象中的,应用程序不能对Channel进行读写操作,而是必须经过Buffer来进行,即channel是通过Buffer进行读写数据
Buffer是NIO读写数据的中转站,Buffer实际上是一个数组,通常是一个字节数据,但也可以是其他类型的数组。但一个缓冲区Buffer不仅仅是一个数组,重要的是他提供了对数据结构话的访问,而且还跟踪系统的读写进程,

使用Buffer读写数据的四个步骤:

1.写入数据到Buffer
2.调用flip()方法
3,从Buffer中读取数据
4.调用clear()方法或者compact()方法

当buffer写入数据的时候,Buffer会记录些写了多少数据,一旦腰读取数据,需要通过flip()方法将Buffer从写入模式切换到读取模式,在读取模式下可以读取之前写入的Buffer的所有数据。一旦读取完了数据,就要清空缓冲区,让他可以再次被写入,有两种方式能清空缓冲区:调用clear()或者compact()方法会晴空整个缓冲区,

关于channel(通道)
Channel是一个对象,可以通过他读取和写入数据,可以把它看作IO中的流,但是有些不同,
1.Channel 是双向的,即可以读又可以写,而流逝单项的,
2.channel可以异步进行读写
3.对Channel的读写必须通过Buffer对象

NIO中的读和写
IO中的读和写,对应的是数据的Stream,NIO中的读和写对应的是Channel和Buffer《NIO中从通道Channel中读取,创建一个Buffer缓冲区,然后让通道Channel读取数据到缓冲区,NIO写入数据到通道channel:创建一个Buffer缓冲区,把数据填充进缓冲区,之后用channel通道对这些数据进行写入。
从文件中读取:
在NIO系统中,任何时候执行一个读的操作,都是从channel通道中进行读取,而不是直接从channel中读取数据,因为所有的数据都需要用Buffer来封装,所以应该是虫channel中读取数据到Buffer缓冲区中。
从文件读取数据需要三个步骤:
1.从FileInputStream获取channel通道
2.创建buffer缓冲区
3.从channel通道读取数据到Buffer

代码实现: 
1.获取通道
FileInputStream fin = new FileInputStream( "read.txt" );FileChannel fc = fin.getChannel();
2:创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
3:将数据从通道读到缓冲区
fc.read( buffer );
二 写入数据到文件
类似于从文件读数据, 
1:获取一个通道
FileOutputStream fout = new FileOutputStream( "write.txt" );FileChannel fc = fout.getChannel();
2:创建缓冲区,将数据放入缓冲区
ByteBuffer buffer = ByteBuffer.allocate( 1024 );for (int i=0; i<message.length; ++i) { buffer.put( message[i] );}buffer.flip();
3:把缓冲区数据写入通道中
fc.write( buffer );




原创粉丝点击