目录
应用:实现数据的分段写入,多线程下载等。
该类不是IO体系中子类,而是直接继承自Object。但是它是IO包中成员,因为它具备读和写功能,其实完成读写的原理就是它的内部封装了字节输入流和输出流。并且它内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer()方法获取指针位置,也可以通过seek()方法改变指针的位置。实现"随机访问”,这里“随机”是指可以跳转到文件的任意位置处读写数据。
构造函数
RandomAccessFile(File file, String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。
RandomAccessFile(String name, String mode):创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
通过其构造函数可以看出,该类只能操作文件,而且操作文件还有模式,如只读(r)、读写(rw)等。
mode 参数指定用以打开文件的访问模式。允许的值及其含意为:
值 | 含意 |
"r" | 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 |
"rw" | 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 |
"rws" | 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 |
"rwd" | 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 |
注意:
如果模式为只读(r):不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现文件找不到异常(FileNotFoundException)。
如果模式为读写(rw):操作的文件不存在,会自动创建;如果文件存在则不会覆盖。
常用方法
void seek(long pos):设置到此文件开头测量到的文件指针偏移量,改变指针的位置,在该位置发生下一个读取或写入操作。
long getFilePointer():返回此文件中的当前偏移量,获取指针位置。
int skipBytes(int n):尝试跳过输入的 n 个字节以丢弃跳过的字节。
void write(byte[] b):将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
void writeInt(int v):按四个字节将 int 写入该文件,先写高字节。
int read(byte[] b):将最多 b.length 个数据字节从此文件读入 byte 数组。
int readInt():从此文件读取一个有符号的 32 位整数。
示例
import java.io.*;
class RandomAccessFileDemo{
public static void main(String[] args)throws IOException{
writeFile_2();
// writeFile();
// readFile();
}
// 读取指定位置数据
public static void readFile()throws IOException{
RandomAccessFile raf=new RandomAccessFile("ran.txt","r");
// 调整对象中指针
raf.seek(8*1); // 可根据存储规律调整指针
// 跳过指定的字节数,只能往后跳,不能反向往前跳
// raf.skipBytes(8);
byte[] buf=new byte[4];
raf.read(buf);
String name=new String(buf);
int age=raf.readInt();
System.out.println("name="+name);
System.out.println("age="+age);
raf.close();
}
// 往文件指定位置(添加,修改)写入数据
public static void writeFile_2()throws IOException{
RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");
raf.seek(8*0); // 即可以添加(原来没有的位置上),也可以修改(已有的位置上)
raf.write("周期".getBytes());
raf.writeInt(103);
raf.close();
}
// 往文件中写入数据
public static void writeFile()throws IOException{
RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");
raf.write("李四".getBytes());
raf.writeInt(97);
raf.write("王五".getBytes());
raf.writeInt(99);
raf.close();
}
}