三分钟学会使用java RandomAccessFile随机读写IO
本文章适用于参与工作的伙伴,马上实现功能,并不想完整的学习一遍,拿来就用。
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile("/Users/Lai/IdeaProjects/Empty/src/main/resources/static/charfile.txt", "rw");
// 获取文件指针位置,默认是从0开始,打印的接口是0,字符的位置从0开始
System.out.println(randomAccessFile.getFilePointer());
// 获取整个文件的字节数。中文字符占用3个字节,英文字符占用1个字节,有效表情占用4个字节
System.out.println(randomAccessFile.length());
// 读取的时候,会把换行符丢掉,但是换行符是被读取走了,getFilePointer()方法获取的指针位置是换行符之后的位置
// 如果准备把读取的东西写回去,一定要注意换行符要自己填充上去
// 如果readLine读取到了null,说明已经读取到文件末尾了
// readLine是从当前的指针位置开始读取的,直到遇到了换行符结束,这是它认为的一个完整行
String s = randomAccessFile.readLine();
// 把当前的指针位置设置成n,指的是第n给字节的位置,字节从0开始计算。在次读取的时候,会从这个字节开始读取
// 设置完成之后randomAccessFile.getFilePointer()的值就等于n了
randomAccessFile.seek(3);
System.out.println(randomAccessFile.getFilePointer());
// 写数据,非常注意,写数据的时候,是字节覆盖原先的字节,并不是插入,指针会自动往后移动
// 比如当前的指针位置是3,写入一个int数字,指针会自动移动到3+4(int占用四个字节)=7的位置
// 好玩的来了,当调用writeInt(7)的时候,会把7转成 00 00 00 07,然后写入到文件中,然后在打开文件,就会看到乱码。
// 此时原文件里面,位置从3开始的4个字节被覆盖成了 00 00 00 07
randomAccessFile.writeInt(7);
//知识点分割线/
// 那怎么实现插入呢?比如现在有- - - - - - - - 8个字节,想要在第五个字节位置(我们说的是从0开始)插入一个汉字
// 先把第五个位置开始,之后的所有字节都读取出来,放到一个临时的文件里面或者内存里面
randomAccessFile.seek(5);
// 准备5个字节之后到文件末尾的字节大小的空间
byte[] temBytes = new byte[(int) (randomAccessFile.length()-5)];
// 读取5个字节之后到文件末尾的字节
randomAccessFile.read(temBytes);
// 把当前的指针位置设置到5,因为上面read之后,指针已经移动到文件末尾了
randomAccessFile.seek(5);
String needInsertStr = "这个是我要插入的内容";
randomAccessFile.write(needInsertStr.getBytes());
// 把备份的内容写回去
randomAccessFile.write(temBytes);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (randomAccessFile != null) {
try {
// 关闭文件
randomAccessFile.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}