您的位置:首页 > 其它

使用NIO来操作文件,内存映射

2007-07-08 09:41 501 查看
java的NIO主要用于对文件的读写操作,效率也比普通IO要高一些。在对文件的操作中,不但支持Byte格式的操作,还支持整数,浮点等基本类型的操作,非常方便。在对大文件的操作中,其特有的文件映射概念可以不用将整个文件都读入内存,就能够对文件的任意位置进行读写,非常的棒。下面我们就来简单的看一下如何使用NIO来操作文件。
NIO对文件的理解与普通IO不同,它将文件抽象为一个通道,也就是FileChannel,而不是流。程序员不能直接与FileChannel打交道,需要通过一个称之为缓冲器的东西,也就是ByteBuffer来对通道进行读写。换句话说,通道和缓冲器是NIO中两个非常重要的概念,正确的理解这两个概念对学习使用NIO是非常重要的。用《java编程思想》里面的话来讲,通道就好像煤矿,所有的资源都蕴藏在通道中,而程序员是煤矿老板(注意哈,不是矿工,是老板),老板肯定不是亲自下去挖煤,而是通过矿工推着小车把煤弄上来。矿工的死活老板是不关心的,老板只关心车里的煤。而缓冲器就是车,所以你只需要和缓冲器打交道就行了,需要什么东西就找缓冲器要,想扔掉什么东西就往缓冲器里面扔。当然,对于煤矿你也是要关心一下的,因为煤矿很大,选择一个恰当的挖煤的地点也是很重要的。下面就来看一下NIO的一些经典应用:
<!--[if !supportLists]-->1、 <!--[endif]-->顺序写入文本文件:
//构造一个文件通道
FileChannel fc1 = new FileOutputStream("d://aa.txt").getChannel();
//使用wrap方法构造一个临时缓冲器,专门用来存储字符串
fc1.write(ByteBuffer.wrap("hello world".getBytes()));
//不要忘记关闭文件
fc1.close();

<!--[if !supportLists]-->2、 <!--[endif]-->随机写入基本数据,如整数:
//构造随机访问的文件通道
FileChannel fc2 = new RandomAccessFile("d://bb.txt", "rw").getChannel();
//构造缓冲器,需要指定大小,单位为Byte
ByteBuffer bb = ByteBuffer.allocate(1024);
//向缓冲器第4个字节处写入整数,若省略位置参数则表示0
bb.putInt(4, 65);
//将缓冲器的limit设置为实际大小,pos设为0,对缓冲器写入操作结束后,必调用此方法。
bb.flip();
//将缓冲器的内容写入到通道的偏移量为8的位置。
fc2.write(bb, 8);
//关闭通道
fc2.close();

<!--[if !supportLists]-->3、 <!--[endif]-->随机读入基本数据:
FileChannel fc3 = new RandomAccessFile("d://bb.txt", "rw").getChannel();
ByteBuffer bb1 = ByteBuffer.allocate(1024);
fc3.read(bb1);
//再强调一遍,凡是对缓冲器进行了写操作后,必调用此方法。
bb1.flip();
int x = bb1.getInt();
System.out.println(x);

<!--[if !supportLists]-->4、 <!--[endif]-->使用视图缓冲器:
就不详细说了,只说说注意事项,对视图缓冲器数据的修改,直接等价于对ByteBuffer的修改;但是,对视图缓冲器pos、limit信息的修改,不会影响到ByteBuffer的pos、limit,非常有必要手动设置ByteBuffer的pos、limit。

<!--[if !supportLists]-->5、 <!--[endif]-->存储器映射文件:
//连通道都省了,直接创建一个映射缓冲器,与文件的映射关系可以通过参数来设置。之后对这个缓冲器的任何操作都等同于对文件的操作,操作方法同上,真是方便啊!!!!
MappedByteBuffer out = new RandomAccessFile("d://bb.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 0xffffff);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐