RandomAccessFile
RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。
与普通的输入/输出流不同的是,RandomAccessFile支持“任意访问”的方式,程序可以直接跳转到文件的任意地方来读写数据。
由于RandomAccessFile可以自由访问文件的任意位置,所以如果只需要访问文件部分内容,而不是把文件从头读到尾,使用RandomAccessFile将是更好的选择。
与OutputStream、Writer等输出流不同的是,RandomAccessFile允许自由定位文件记录指针,RandomAccessFile可以不从开始的地方开始输出,因此RandomAccessFile可以向已存在的文件后追加内容。如果程序需要向已存在的文件后追加内容,则应该使用RandomAccessFile。
RandomAccessFile的方法虽然多,但它有一个最大的局限,就是只能读写文件,不能读写其他IO节点。
RandomAccessFile对象也包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会向后移动n个字节。
除此之外,RandomAccessFile可以自由移动该记录指针,既可以向前移动,也可以向后移动。RandomAccessFile包含了如下两个方法来操作文件记录指针。
- long getFilePointer():返回文件记录指针的当前位置。
- void seek(long pos):将文件记录指针定位到pos位置。
RandomAccessFile既可以读文件,也可以写,所以它既包含了完全类似于InputStream的三个read()方法,其用法和InputStream的三个read()方法完全一样;也包含了完全类似于OutputStream的三个write()方法,其用法和OutputStream的三个write()方法完全一样。
除此之外,RandomAccessFile还包含了一系列的readXxx()和writeXxx()方法来完成输入、输出。
提示:
RandomAccessFile的含义是可以自由访问文件的任意地方(与InputStream、Reader需要依次向后读取相区分)
RandomAccessFile类有两个构造器,其实这两个构造器基本相同,只是指定文件的形式不同而已—一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象时还需要指定一个mode参数,该参数指定RandomAccessFile的访问模式,该参数有如下4个值:
- “r”:以只读方式打开指定文件。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
- “rw”:以读、写方式打开指定文件。如果该文件尚不存在,则尝试创建该文件。
- “rws”:以读、写方式打开指定文件。相对于"rw"模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
- “rwd”:以读、写方式打开指定文件。相对于"rw"模式,还要求对文件内容的每个更新都同步写入到底层存储设备。
public class RandomAccessTest {
public static void main(String[] args) {
try (
RandomAccessFile randomAccessFile = new RandomAccessFile("src\\com\\rrz\\RandomAccessTest.java", "r");
) {
System.out.println("文件初始指针位置" + randomAccessFile.getFilePointer());
randomAccessFile.seek(300);
int hasRead;
byte[] bytes = new byte[32];
while ((hasRead = randomAccessFile.read(bytes)) > 0) {
System.out.println(new String(bytes, 0, hasRead));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
创建了一个RandomAccessFile对象,该对象以只读方式打开了RandomAccessFileTest.java文件,这意味着该RandomAccessFile对象只能读取文件内容,不能执行写入。
将文件记录指针定位到300处,也就是说,程序将从300字节处开始读、写,程序接下来的部分与使用InputStream读取并没有太大的区别。
如何向指定文件后追加内容,为了追加内容,程序应该先将记录指针移动到文件最后然后开始想文件中输出内容。
注意:
RandomAccessFile依然不能向文件的指定位置插入内容,如果直接将文件记录指针移动到中间某位置后开始输出,则新输出的内容会覆盖文件中原有的内容。如果需要向指定位置插入内容,程序需要先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面。