美文网首页
java7新特性6——随机读写文件

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

作者: 不迷失 | 来源:发表于2017-04-08 11:22 被阅读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

    相关文章

      网友评论

          本文标题:java7新特性6——随机读写文件

          本文链接:https://www.haomeiwen.com/subject/kudlattx.html