首页 > Java > java教程 > 正文

随机访问文件

WBOY
发布: 2024-07-09 19:17:24
转载
522人浏览过

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

随机访问文件由字节序列组成。一个称为文件指针的特殊标记位于这些字节之一。读或写操作发生在文件指针的位置。打开文件时,文件指针设置在文件的开头。当您向文件读取或写入数据时,文件指针向前移动到下一个数据项。例如,如果使用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 行。

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:dev.to网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号