”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 随机访问文件

随机访问文件

发布于2024-08-01
浏览:275

Java 提供了 RandomAccessFile 类,允许在文件中的任何位置读取和写入数据。到目前为止您使用过的所有流都称为 只读只写 流。这些流称为顺序流。使用顺序流打开的文件称为顺序访问文件。顺序存取文件的内容无法更新。然而,经常需要修改文件。 Java 提供了 RandomAccessFile 类来允许在文件中的任何位置读取和写入数据。使用 RandomAccessFile 类打开的文件称为 随机访问文件

RandomAccessFile类实现了DataInputDataOutput接口,如下图所示。 DataInput 接口定义了读取原始类型值和字符串的方法(例如,readIntreadDoublereadChar readBooleanreadUTF)和 DataOutput 接口定义了写入原始类型值和字符串的方法(例如,writeIntwriteDouble, writeChar, writeBoolean, writeUTF).

Image description

创建RandomAccessFile时,您可以指定两种模式之一:rrw。模式r表示该流是只读的,模式rw表示该流允许读和写。例如,以下语句创建一个新流 raf,该流允许程序读取和写入文件 test.dat:

RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");

如果test.dat已经存在,则创建raf来访问它;如果test.dat不存在,则创建一个名为test.dat的新文件,并创建raf来访问新文件。 raf.length() 方法返回任意给定时间 test.dat 中的字节数。如果将新数据追加到文件中,raf.length() 会增加。

如果不想修改该文件,请使用r模式打开它。这可以防止无意中修改文件。

随机访问文件由字节序列组成。称为 文件指针 的特殊标记位于这些字节之一。读或写操作发生在文件指针的位置。打开文件时,文件指针设置在文件的开头。当您向文件读取或写入数据时,文件指针向前移动到下一个数据项。例如,如果使用 readInt() 读取 int 值,则 JVM 从文件指针读取 4 字节,现在文件指针为 比上一个位置提前4字节,如下图所示。

Image description

对于RandomAccessFile raf,可以使用raf.seek(position)方法将文件指针移动到指定位置。 raf.seek(0) 将其移至文件开头,raf.seek(raf.length()) 将其移至文件末尾。下面的代码演示了 RandomAccessFile.

package demo;
import java.io.*;

public class TestRandomAccessFile {

    public static void main(String[] args) throws IOException {
        try( // Create a random access file
            RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw");
        ) {
            // Clear the file to destroy the old contents if exists
            inout.setLength(0);

            // Write new integers to the file
            for(int i = 0; i 



当前文件长度为800
第一个数字是 0
第二个数字是 1
第十个数字是 9
新的长度是804
第11个数字是555

A RandomAccessFile 是为名为 inout.dat 的文件创建的,模式为 rw,以允许第 8 行中的读取和写入操作。

inout.setLength(0) 将长度设置为第 11 行中的 0。这实际上会破坏文件的旧内容。

for循环将200 int值从0199写入文件第14行和第15行。 &&&]int 值需要 4 字节,从 inout.length() 返回的文件总长度现在是 800(第 18 行),如示例输出所示。

第 21 行调用

inout.seek(0) 将文件指针设置为文件开头。 inout.readInt() 读取第 22 行中的第一个值,并将文件指针移动到下一个数字。第二个数字在第 26 行读取。

inout.seek(9 * 4)(第 29 行)将文件指针移动到第十个数字。 inout.readInt() 读取第十个数字并将文件指针移动到第 30 行中的第十一个数字。 inout.write(555) 在当前位置写入新的第十一个数字 (第 33 行)。之前的第十一个数字被销毁。

inout.seek(inout.length()) 将文件指针移动到文件末尾(第 36 行)。 inout.writeInt(999)999 写入文件(第 37 行)。现在文件的长度增加了 4,因此 inout.length() 返回 804(第 40 行)。

inout.seek(10 * 4) 将文件指针移动到第 43 行中的第十一个数字。新的第十一个数字 555 显示在第 44 行中。

版本声明 本文转载于:https://dev.to/paulike/random-access-files-1464?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3