【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
在后面继续学习