RandomAccessFile类用于随机访问文件,自身具备读和写的方法,通过skipBytes(int x),seek(int x)方法来达到随机访问的目的。
RandomAccessFile类的实例支持对随机访问文件的读取和写入。
随机访问文件的行为类似于存储在文件系统中的一个大型byte数组。存在指向隐函数组的光标或索引,称为文件指针。
该类不算是IO体系中的子类,因为该类直接继承自Object类,但是它是IO包中的成员,因为它具备读和写的功能。在内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek方法来改变指针的位置。
其实完成读写的原理就是内部封装了字节输入流和输出流。
通过RandomAccessFile的构造函数我们可以看出:该类只能操作文件而且操作文件还有模式。
RandomAccessFile对象的构造函数要操作的文件不存在会自动创建文件,如果存在则不会覆盖已有的文件。如果模式为只读r,则不会创建文件,而是会去读取一个已经存在的文件,如果该文件存在,则会出现异常;如果模式为rw,操作的文件不存在,则会自动创建文件,如果存在,则不会覆盖该文件。
RandomAccessFile的实际应用:将文件分段写入,一个线程对应一段,是文件多线程下载的原理
示例:
public void writeFile() throws IOException{
RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
raf.write("李四".getBytes());
raf.writeInt(255);
raf.close();
}
public void readFile() throws IOException{
RandomAccessFile raf = new RandomAccessFile("raf.txt","r");
byte[] buf = new byte[4];
raf.read(buf);
int num = raf.readInt();
raf.close();
}
public void writeFile2() throws IOException{
RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
raf.seek(8*3);//调整对象中的指针
raf.skipBytes(8);//跳过指定的字节数,但是不能往回跳
raf.write("zhangsan".getBytes());
raf.writeInt(90);
raf.close();
}