随机访问文件

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

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

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模式打开它。这可以防止无意中修改文件。

灵机语音 灵机语音

灵机语音

灵机语音 56 查看详情 灵机语音

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

Image description

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

打包演示;导入java.io.*;公共类测试随机访问文件{    公共静态无效主(字符串[] args)抛出IOException {        try( // 创建一个随机访问文件            RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw");        ){            // 清除文件以销毁旧内容(如果存在)            inout.setLength(0);            // 将新整数写入文件            for(int i = 0; i < 200; i++)                inout.writeInt(i);            // 显示当前文件的长度            System.out.println("当前文件长度为" + inout.length());            // 获取第一个数字            inout.seek(0); // 将文件指针移至开头            System.out.println("第一个数字是 " + inout.readInt());            // 获取第二个数            inout.seek(1 * 4); // 将文件指针移动到第二个数字            System.out.println("第二个数字是 " + inout.readInt());            // 获取第十个数字            inout.seek(9 * 4); // 将文件指针移至第十个数字            System.out.println("第十个数是" + inout.readInt());            // 修改第十一个数            inout.writeInt(555);            // 追加一个新数字            inout.seek(inout.length()); // 将文件指针移到末尾            inout.writeInt(999);            // 显示新的长度            System.out.println("新长度为 " + inout.length());            // 获取新的第十一个数字            inout.seek(10 * 4); // 将文件指针移至第十一个数字            System.out.println("第十一个数是" + inout.readInt());        }    }}

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

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

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

for循环将0199200个int值写入第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(第4​​0行)。

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

以上就是随机访问文件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/519402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 04:43:29
下一篇 2025年11月9日 04:47:43

相关推荐

发表回复

登录后才能评论
关注微信