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当前文件长度为800
第一个数字是 0
第二个数字是 1
第十个数字是 9
新的长度是804
第11个数字是555A RandomAccessFile 是为名为 inout.dat 的文件创建的,模式为 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 行中。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3