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

随机访问文件

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

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]删除
最新教程 更多>
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-07-14
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-07-14
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-07-14
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-07-14
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-14
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-07-14
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-14
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-07-14
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-14
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-07-14
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-07-14
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-07-14
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-07-14
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-07-14
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符提取最后一行,在Postgresql中,您可能需要遇到与在数据库中的每个不同标识相关的信息中提取信息的情况。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: ...
    编程 发布于2025-07-14

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

Copyright© 2022 湘ICP备2022001581号-3