1.RandomAccessFile类概述
这个是JDK上的截图,我们可以看到它的父类是Object,没有继承字节流、字符流家族中任何一个类,不属于IO流。RandomAccessFile类的主要功能是完成随机读取功能,可以读取指定位置的内容。
之前的File类只是针对文件本身进行操作的,而如果要想对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机读取一个文件中指定位置的数据。
随机访问文件原理,首先把随机访问的文件对象看作存储在文件系统中的一个大型 byte数组,然后通过指向该byte数组的光标或索引(即:文件指针 filePointer)在该数组任意位置读取或写入任意数据。
例如,现在假设文件中保存类以下三个数据:zhangsan, 30、 lisi, 31、wangwu, 32
文件中,所有内容都是按照字节存放的,都有固定的保存位置。
2.RandomAccessFile类方法
- 构造方法
接收File类的对象来指定操作路径,mode参数用于设置访问模式:“r
”只读,“rw
”读写
public RandomAccessFile(String name, String mode);
接收字符串来指定操作路径,mode参数用于设置访问模式:“r
”只读,“rw
”读写
public RandomAccessFile(File file, String mode);
- 存取数据案例
【示例】存取数据案例
public class RandomAccessFileDemo {
// 读取数据
public static void read() throws IOException {
RandomAccessFile acf = new RandomAccessFile("info.txt", "r");
// 读取一组数据
byte[] by1 = new byte[8];
acf.read(by1);
int age1 = acf.readInt();
// 输出:name:zhangsan age:28
System.out.println("name:" + new String(by1) + " age:" + age1);
// 读取一组数据
byte[] by2 = new byte[8];
acf.read(by2);
int age2 = acf.readInt();
// 输出:name:lisi age:38
System.out.println("name:" + new String(by2) + " age:" + age2);
// 关闭流
acf.close();
}
// 存储数据
public static void write() throws IOException {
// 读写模式,如果文件不存在,会自动创建
RandomAccessFile acf = new RandomAccessFile("info.txt", "rw");
// 添加一组数据
acf.write("zhangsan".getBytes()); // 将8个字节的姓名写入文件之中
acf.writeInt(28); // 将4个字节的年龄写入文件之中
// 添加一组数据
acf.write("lisi ".getBytes()); // 将8个字节的姓名写入文件之中
acf.writeInt(38); // 将4个字节的年龄写入文件之中
// 关闭流
acf.close();
}
}
- 追加数据案例
使用RandomAccessFile来追加文件内容,先获取到文件的长度,再将指针移到文件的末尾,最后将要插入的内容插入到文件。
获取到文件的长度
public native long length();
将文件记录指针定位到pos位置
public native void seek(long pos);
返回文件记录指针的当前位置
public native long getFilePointer();
【示例】追加数据案例
public class RandomAccessFileDemo {
// 存储数据
public static void write() throws IOException {
RandomAccessFile acf = new RandomAccessFile("info.txt", "rw");
// 获取文件长度
long length = acf.length();
// 设置指针移到文件的末尾
acf.seek(length);
// 在添加一组数据
acf.write("wangwu ".getBytes()); // 将8个字节的姓名写入文件之中
// 获取当前指针的位置
long pointer = acf.getFilePointer();
System.out.println("当前指针的位置:" + pointer);
acf.writeInt(48); // 将4个字节的年龄写入文件之中
// 关闭流
acf.close();
}
}
通过指针操作,可以实现在 文件的任意位置插入或获取文件内容。
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。