Java 提供了 RandomAccessFile 类,允许在文件中的任何位置读取和写入数据。到目前为止,您使用过的所有流都称为只读或只写流。这些流称为顺序流。使用顺序流打开的文件称为顺序访问文件。顺序存取文件的内容无法更新。然而,经常需要修改文件。 Java 提供了 RandomAccessFile 类来允许在文件中的任何位置读取和写入数据。使用 RandomAccessFile 类打开的文件称为 随机访问文件。
RandomAccessFile 类实现了 DataInput 和 DataOutput 接口,如下图所示。 DataInput 接口定义了读取原始类型值和字符串的方法(例如,readInt、readDouble、readChar、 readBoolean、readUTF)和 DataOutput 接口定义了写入原始类型值和字符串的方法(例如,writeInt、writeDouble、writeChar、writeBoolean、writeUTF)。
创建 RandomAccessFile 时,您可以指定以下两种模式之一:r 或 rw。模式 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 个字节,如下图所示。
对于
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 < 200; i++) inout.writeInt(i); // Display the current length of the file System.out.println("Current file length is " + inout.length()); // Retrieve the first number inout.seek(0); // Move the file pointer to the beginning System.out.println("The first number is " + inout.readInt()); // Retrieve the second number inout.seek(1 * 4); // Move the file pointer to the second number System.out.println("The second number is " + inout.readInt()); // Retrieve the tenth number inout.seek(9 * 4); // Move the file pointer to the tenth number System.out.println("The tenth number is " + inout.readInt()); // Modify the eleventh number inout.writeInt(555); // Append a new number inout.seek(inout.length()); // Move the file pointer to the end inout.writeInt(999); // Display the new length System.out.println("The new length is " + inout.length()); // Retrieve the new eleventh number inout.seek(10 * 4); // Move the file pointer to the eleventh number System.out.println("The eleventh number is " + inout.readInt()); } } }
第一个数字是 0
第二个数字是 1
第十个数字是 9
新的长度是804
第11个数字是555
inout.dat 的文件创建一个 RandomAccessFile,模式为 rw,以允许第 8 行中的读取和写入操作。
inout.setLength(0) 将第 11 行中的长度设置为 0。这实际上会破坏文件的旧内容。
for 循环将 200 个 int 值从 0 到 199 写入文件第 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 行中。
以上是随机访问文件的详细内容。更多信息请关注PHP中文网其他相关文章!