java7新特性6——随机读写文件

2017-04-08  本文已影响665人  不迷失

java7允许我们随机访问文件

1f2f7374e1990b4bb551fd141bc4a53d1f2f7374e1990b4bb551fd141bc4a53d

所谓随机访问就是允许我们不按照顺序的访问文件的内容,这里的访问包括读和写。

要随机的访问文件,我们就要打开文件,定位到指定的位置,然后读或写文件内容。

在Java7中,SeekableByteChannel接口提供了这个功能

SeekableByteChannel提供了一些简单易用的方法。依靠这些方法,我们能够设置或查询当前的位置,然后从当前位置读或者往当前位置写。

该接口提供的方法有:

position – 查询通道当前的位置
position(long) – 设置通道当前的位置
read(ByteBuffer) – 从通道向缓冲区读字节内容
write(ByteBffer) – 将缓冲区内的字节内容写入通道
truncate(long) – 截断连接到通道的文件(或其他实体)

FileChannel实现了该接口。

在实际的使用中,我们可以用FileChannel.open获取一个 FileChannel。

FileChannel提供了一些高级的特性,如将文件的一部分直接映射到内存中来提高访问速度、锁定文件的一部分、直接在指定的绝对位置读或写而不影响通道的当前位置等。

示例:

package java7;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * @author qiang.xie
 * @date 2017/4/7
 */
public class SeekChannal {

    public static void main(String[] arg) throws IOException {
        FileChannel fileChannel=FileChannel.open(Paths.get("f:\\test.txt"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE);
        fileChannel.write(ByteBuffer.wrap("hello,java".getBytes()));
        fileChannel.position(0);//定位到文件开头
        fileChannel.write(ByteBuffer.wrap("seek".getBytes()));
        fileChannel.position(fileChannel.size());//定位到文件末尾
        fileChannel.write(ByteBuffer.wrap("end".getBytes()));

        //将通道中的指定位置开始的内容传输到另一个通道中,这里传输到控制台
       fileChannel.transferTo(1,fileChannel.size(),Channels.newChannel(System.out));
    }
}

该示例打开一个test.txt文件通道,先写入hello,java,然后再定位到文件开头,写入seek,这意味着会覆盖最开始的hell四个字符,然后定位到文件末尾,再写入end。然后通过transferTo将文件内容传入到控制台。

运行结果:

eeko,javaend

由于可以从指定位置读写文件,SeekableByteChannel使得我们有了很多想象空间。比如你可以使用多线程去从一个很大的文件中去查找某些内容等等。

--

@不迷失|知识改善生活

weixinweixin
微信公众号:java技术

专注技术研究与视频教学,分享有价值的技术与经验,关注程序员的发展!

--

技术博客:http://bumishi.cn

技术交流群:245130488

@不迷失教学视频

QQ课堂:http://bumishi.ke.qq.com

百度传课:http://chuanke.com/s3377987.html

上一篇下一篇

猜你喜欢

热点阅读