【Java】Input,Output,Stream I/O流 05 RandomAccessFile 随机访问文件类

RandomAccessFile 随机访问文件类

直接继承java.lang.Object 实现DataInput & DataOutput 接口

即是输入流,也是输出流

 

public class RandomAccessFileTest {
    public static void main(String[] args) throws Exception {
        // mode的四个参数
        // r 只读方式打开     不创建文件,读取一个已存在的文件,文件不存在则抛出异常
        // rw 打开读取和写入  不存在文件则创建,反之直接读取和写入
        // rwd 读取和写入 + 同步内容更新
        // rws 读取和写入 + 同步内容 & 元数据 的更新
        RandomAccessFile raf1 = new RandomAccessFile(new File("1774415.jpg"),"rws");
        RandomAccessFile raf2 = new RandomAccessFile(new File("raf2.jpg"),"rws");

        byte[] bytesBuffer = new byte[1024];
        int len;
        while ((len = raf1.read(bytesBuffer)) != -1){
            raf2.write(bytesBuffer,0,len);
        }

        raf1.close();
        raf2.close();
    }
}

 

- 作为输出流时,直接覆写文件,没有文件存在创建文件写入,文件存在且已有内容从头覆盖写入

- 如果要实现插入覆写,可在编写之前,调用 void seek(int index) 方法 设置指针在文件种写入的位置

- 要在已有内容的基础上追加写入,就要把指针移动到最后一位,最后一位就是File对象的字节长度,file.Length()的位置即可

- 实现插入写入

  1、先从插入位置读取后面的数据,保存下来

  2、指针此时在最后的位置,我们需要拨回指针位置到原来的插入位置上

  3、调用seek方法,再开始覆写操作,

  4、再把1保存的数据执行覆写

    static void insert() throws Exception {
        RandomAccessFile raf = new RandomAccessFile("sample.txt","rws");

        raf.seek(2); // 拨动指针到指定位置

        // 设置一个字符串的缓冲类,用于保存我们读取的内容,长度不会超过这个文件的字节长度
        StringBuilder stringBuilder = new StringBuilder((int)new File("sample.txt").length());

        byte[] bytesBuffer = new byte[5];
        int len;
        while ( (len = raf.read(bytesBuffer)) != -1){
            // 采用追加方法写进字符串缓冲对象
            stringBuilder.append(raf.read(bytesBuffer,0,len));
        }

        // 拨回指针
        raf.seek(4);

        // 插入我们需要的数据内容
        raf.write("这是我们插入进去的数据".getBytes());

        // 再写入之前保存的数据
        raf.write(stringBuilder.toString().getBytes());

        // 释放
        raf.close();
    }

功能实现了,但是还是乱码....暂时未解决

 

关于新IO的介绍  https://www.bilibili.com/video/BV1Kb411W75N?p=618

在后面继续学习

 

posted @ 2020-04-22 16:22  emdzz  阅读(155)  评论(0编辑  收藏  举报