Java 文件IO随机读写RandomAccessFile

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dyingstraw/article/details/85006627

目录

前言

RandomAccessFile优势:

添加

任意位置插入

扩展


前言

在一个文本文件的结尾添加一些数据,仔细一听。这个问题很是简单。先把数据读出来,然后再修改读出的数据,再把它写进文件。咋一看,还真是那么简单。但是如果文件由1个G大小,勉勉强强好像没什么问题。但是,我可能要处理20G的文件怎么办?我的电脑内存只有8G,完全没辙啊。一次下面引入RandomAccessFile的方法。

完成上面的需求,如果用RandomAccessFile的话,完全可以实现0内存追加。先看一下这个类的一些功能吧。

RandomAccessFile优势:

RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。

区别于普通IO读取,RandomAccessFile多了两个比较重要的方法

方法名 作用
getFilePointer() 返回文件记录指针的当前位置
seek(long pos) 将文件记录指针定位到pos的位置

接下来用代码完成追加的功能:

添加

//在文件末尾添加内容
    public static void append(String path) throws IOException {
        /**
         * mode各个参数详解 
         * r 代表以只读方式打开指定文件 
         * rw 以读写方式打开指定文件 
         * rws 读写方式打开,并对内容或元数据都同步写入底层存储设备 
         * rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备 
         *
         * **/
        RandomAccessFile randomAccessFile = new RandomAccessFile(path,"rw");
        long end = randomAccessFile.length();
        randomAccessFile.seek(end);
        // char[] buff = new char[100];
        randomAccessFile.write("this is test!".getBytes());
        randomAccessFile.close();
    }

原始的文件内容:

添加之后的:

任意位置插入

原始的类中并没有提及在任意位置插入的功能,但是,我们可以通过提供的功能封装任意位置插入的功能,需要建立一个临时文件,具体实现如下:

//随意位置插入
    public static void insert(String path,long pos) throws IOException {
        RandomAccessFile file = new RandomAccessFile(path,"rw");
        long size = file.length();
        if (pos>=size){
            throw new IndexOutOfBoundsException("当前插入位置超过了文件尾部");
        }
        //新建临时文件
        File ttt = new File("tmp");
        RandomAccessFile tmpFile = new RandomAccessFile(ttt,"rw");
        byte[] tmp = new byte[1024];

        file.seek(pos);
        tmpFile.seek(0);
        int tmpsize=0;
        long pos1 =pos;
        long pos2=0;
        //取出插入位置之后的数据,放入临时文件
        while ((tmpsize=file.read(tmp))>0){
            tmpFile.write(tmp,0,tmpsize);
            pos1+=tmpsize;
            pos2+=tmpsize;
            tmpFile.seek(pos2);
            file.seek(pos1);
        }
        byte[] buff = "insertHere!".getBytes();
        file.seek(pos);
        file.write(buff);
        pos1 = pos + buff.length;
        pos2=0;
        file.seek(pos1);
        tmpFile.seek(pos2);
        //将临时文件数据加入源文件尾部
        while ((tmpsize=tmpFile.read(tmp))>0){
            file.write(tmp,0,tmpsize);
            pos1+=tmpsize;
            pos2+=tmpsize;
            tmpFile.seek(pos2);
            file.seek(pos1);
        }
        file.close();
        //删除临时文件
        ttt.delete();
        tmpFile.close();

    }

原始

之后

扩展:

其实,我们在下载的时候,下载器也会新建一个临时文件,等下载结束后,把文件名改成真实的文件名,利用的也是这个功能。用户下载的时候通过数据中的文件指针信息,实现断点续传的功能。

猜你喜欢

转载自blog.csdn.net/dyingstraw/article/details/85006627