RandomAccessFile:
随机访问文件,自身具备读写的方法。通过skipBytes(int x),seek(int x)来达到随机访问。
该类不算是IO体系中子类,而是直接继承自Object
但是它是IO包中成员,因为它具备读写功能。
随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。
构造方法摘要 |
|
RandomAccessFile(File file, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。 |
|
RandomAccessFile(String name, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。 |
Mode:操作模式
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
如果模式为r(只读),不会创建文件,如果文件不存在会出现异常
如果模式为rw,文件不存在会自动创建,如果存在则不会覆盖
RandomAccessFile支持从任意位置读写文件,这种特性非常符合多线程下载的原理。
假设一个文件大小为20,那么开4个线程,每个线程下载5
0--5
6--10
11-15
16--20
创建RandomAccessFile对象:
RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");
读写方法:
raf.write("张三".getBytes()); raf.writeInt(97); byte buff[] = new byte[4]; raf.read(buff);
调整对象中指针
raf.seek(8);
跳过指定的字节数
raf.skipBytes(8);
举个栗子:
public class RandomAccessFileDemo { public static void main(String[] args) throws Exception { writeFile();// // readFile(); // writeFile2();// 从指定位置开始写文件 writeFile3();// 从原文件中间开始写文件,会覆盖当前指针之后的同等长度内容 } private static void writeFile3() throws Exception { RandomAccessFile raf = new RandomAccessFile("data.txt", "rw"); // seek 和 skipBytes 两个方法都会覆盖之后的内容 // raf.seek(8); raf.skipBytes(8); raf.write("老李".getBytes()); raf.write(102); raf.close(); } public static void writeFile2() throws Exception { RandomAccessFile raf = new RandomAccessFile("data.txt", "rw"); // 从24个字节之后开始写 raf.seek(8 * 3); raf.write("周期".getBytes()); raf.write(103); } public static void readFile() throws Exception { RandomAccessFile raf = new RandomAccessFile("data.txt", "r"); // raf.write("hahaha".getBytes()); // 调整对象中指针 // raf.seek(8); // 从第8个字节开始读文件,读出来的是李斯 // 跳过指定的字节数 // raf.skipBytes(8); byte buff[] = new byte[4]; raf.read(buff); String s = new String(buff); System.out.println("name = " + s); int age = raf.readInt(); System.out.println("age = " + age); raf.close(); } public static void writeFile() throws Exception { RandomAccessFile raf = new RandomAccessFile("data.txt", "rw"); raf.write("张三".getBytes()); raf.writeInt(97); raf.write("李斯".getBytes()); raf.writeInt(99); raf.close(); } }