Java NIO 入门(三)从理论到实践:使用NIO读写
Java NIO 入门(三)从理论到实践:使用NIO读写
guibin.beijing@gmail.com
概述
读和写是最基础的IO处理。从Channel中读是非常简单的,我们只要创建一个Buffer,然后要求Channel往Buffer中读数据。写也很简单,也需要创建一个Buffer,把要写的数据填充到Buffer中,然后要求Channel把Buffer中的数据写出去。
在这节中,我们学习使用JAVA程序来读写数据,顺便浏览一下NIO的主要组件(Buffer,Channel以及相关的方法)并且看看他们在读写数据时如何交互,在后面的章节中我们将依次查看每个组件的细节。
从文件中读数据
在第一个练习中,我们首先从文件中读取一些数据。如果使用老的IO,只需要简单的创建FileInputStream,然后从中读取数据。在NIO中,事情变得有些不同了,首先需要从FileInputStream中获取Channel对象,然后使用这个Channel去读文件。
在NIO系统中任何时刻执行一个读操作时,都要从Channel中读,但不是直接从Channel中读。由于所有的数据都需要通过Buffer承载,所以需首先从Channel中把数据读进Buffer。
因此,从文件中读数据一共有三步:
从FileInputStream中获取Channel创建Buffer从Channel中把数据读入Buffer
下面我们仔细看看具体时如何工作的。
三步简单的工作
第一步获取Channel。从FileInputStream中获取Channel。
FileInputStream fin = new FileInputStream( "readandshow.txt" ); FileChannel fc = fin.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
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 );
fcin.read( buffer ); fcout.write( buffer );
int r = fcin.read( buffer );if (r==-1) { break;}
buffer.clear(); int r = fcin.read( buffer );if (r==-1) { break;}buffer.flip(); fcout.write( buffer );