RandomAccessFile详解

专门处理文件的类------RandomAccessFile类 Java除了File类之外,还提供了专门处理文件的类,即RandomAccessFile(随机访问文件)类。该类是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile类支持“随机访问”方式,这里“随机”是指可以跳转到文件的任意位置处读写数据。在访问一个文件的时候,不必把文件从头读到尾,而是希望像访问一个数据库一样“随心所欲”地访问一个文件的某个部分,... 阅读详情
AI摘要

本文介绍了Java中的RandomAccessFile类,它可随机访问文件,兼具读写功能,能修改文件内容。文中阐述了其构造函数、功能特点、常用方法,如文件指针定位、读写等,还说明了使用场景,包括文件分块合并、数据库文件等,同时提醒了线程安全等注意事项。

RandomAccessFile

RandomAccessFile 是 Java 中一个功能强大的文件访问类,它既可以读取文件,也可以写入文件,而且可以在文件的任意位置进行读写操作。它的名字 “Random Access” 表明了其最重要的特点:它允许用户在文件中随机访问任意位置的数据,既支持顺序操作,也支持非顺序(随机)操作。

以下是 RandomAccessFile 的详细介绍,包括它的功能、使用场景以及常见方法:


1. 构造函数

RandomAccessFile 有两个主要构造函数:

RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
  • 参数 file/name:指定要打开的文件,可以是一个 File 对象或者一个字符串路径。
  • 参数 mode:表示打开文件的模式,可以是:
    • "r":只读模式(read-only)。不允许修改文件,只能读取数据。
    • "rw":读写模式(read-write)。可以读写文件内容。

2. RandomAccessFile 的功能特点

a. 随机访问

RandomAccessFile 的最重要的特点是支持随机访问。与顺序读取的文件类不同,RandomAccessFile 允许你跳到文件的任何位置来读写数据。通过指定文件的指针位置,可以实现灵活的操作。

  • 文件指针(file pointer):RandomAccessFile 有一个指针指向文件中的当前位置,指针初始为文件的起始位置。每次读写操作都会移动这个指针。你可以通过 seek() 方法来改变指针位置,从而在文件的任何地方进行操作。
b. 读写功能并存

它可以同时支持文件的读取和写入,而且你可以自由地在文件的任何位置进行读写。这与其他 I/O 流不同,其他流通常只能顺序读或顺序写。

c. 文件内容修改

除了支持在文件任意位置插入数据外,它还允许修改文件的内容。在一些应用场景下,例如日志文件、数据库文件、或者需要频繁读取和写入的文件时,RandomAccessFile 特别有用。


3. 常用方法

a. seek(long pos):文件指针定位

seek() 是 RandomAccessFile 的核心方法,它用于将文件指针移动到文件的指定位置:

raf.seek(1024);  // 将文件指针移动到文件第1024个字节处
  • 参数 pos:表示要移动到的字节位置。pos 从文件的开始位置计算,位置 0 表示文件的起始点。
b. getFilePointer():获取当前文件指针位置

用于获取文件指针的当前位置:

long pointer = raf.getFilePointer();  // 获取当前文件指针的位置
c. 读写方法
1. 读取数据

RandomAccessFile 提供了多种读取数据的方法,这些方法可以按照不同的数据类型读取内容。

  • read():读取一个字节,返回的是 byte 类型数据(0 到 255 之间的值),如果到达文件末尾,则返回 -1。

    int byteValue = raf.read();
    
  • read(byte[] b):从文件中读取多个字节到字节数组 b 中。

    byte[] buffer = new byte[1024];
    int bytesRead = raf.read(buffer);  // 读取 1024 字节到 buffer 数组中
    
  • read(byte[] b, int off, int len):可以用来从文件中读取数据到字节数组的指定位置,并读取指定的字节数

    	// 定义一个字节数组,存储读取的数据
    	byte[] buffer = new byte[100];
    	// 偏移量:我们将在字节数组中从第10个字节开始写入数据
    	int offset = 10;
    	// 读取的字节数:从文件中读取50个字节
    	int length = 50;
    	// 从文件的当前指针位置读取数据并写入到字节数组的偏移位置
    	int bytesRead = raf.read(buffer, offset, length);
    
  • readInt()、readLong()、readDouble():可以分别读取 4 字节的整数、8 字节的长整数、8 字节的浮点数。

    int intValue = raf.readInt();     // 读取4字节int
    long longValue = raf.readLong();  // 读取8字节long
    double doubleValue = raf.readDouble();  // 读取8字节double
    
2. 写入数据

RandomAccessFile 同样提供了多种写入数据的方法。

  • write(int b):写入一个字节到文件中。

    raf.write(65);  // 写入字节值 65(即 ASCII 码 'A')
    
  • write(byte[] b):将字节数组 b 写入文件。

    byte[] buffer = {65, 66, 67};
    raf.write(buffer);  // 写入 "ABC" 到文件
    
  • write(byte[] b, int off, int len):写入部分字节数组。

    • 功能:将字节数组 b 中从偏移量 off 开始的 len 个字节写入文件。
    • 影响:文件指针前移写入的字节数。
    byte[] buffer = "HelloWorld".getBytes();
    raf.write(buffer, 0, 5);  // 只写入 "Hello"
    raf.close();
    
  • writeInt(int v)、writeLong(long v)、writeDouble(double v):分别将 4 字节的整数、8 字节的长整数、8 字节的双精度浮点数写入文件。

    raf.writeInt(12345);       // 写入整数
    raf.writeLong(123456789L); // 写入长整数
    raf.writeDouble(12.34);    // 写入双精度浮点数
    
d. length():获取文件长度

可以通过 length() 方法获取文件的字节长度:

long fileLength = raf.length();  // 获取文件总长度(字节数)
e. setLength(long newLength):设置文件长度

可以通过 setLength() 方法调整文件的长度。如果新长度大于当前文件长度,文件会自动扩展;如果新长度小于当前长度,文件会被截断。

raf.setLength(1024);  // 将文件长度设为1024字节
f. close():关闭文件

关闭 RandomAccessFile,释放文件资源:

raf.close();  // 关闭文件流

4. 使用场景

RandomAccessFile 非常适合以下几种场景:

a. 文件分块与合并

你可以利用 seek() 定位文件的任意部分,结合 read() 和 write() 方法,实现对大文件的分块操作。这种技术通常用于文件上传、下载等场景。

b. 数据库文件

在构建简单的文件数据库时,RandomAccessFile 可以在文件中插入、更新、删除特定位置的数据,而无需重新读取整个文件。

c. 日志文件

对于需要频繁追加数据的日志文件,RandomAccessFile 可以方便地在文件末尾写入新日志,而不需要重新读取或写入文件的其他部分。

d. 视频流、音频流的处理

在处理大文件(如视频、音频)时,RandomAccessFile 的随机访问功能非常重要,因为这些文件通常需要快速定位到某一帧进行处理,而不是顺序读取。


5. 注意事项

  1. 线程安全:RandomAccessFile 本身不是线程安全的。如果多个线程同时访问同一个 RandomAccessFile 对象,可能会导致数据不一致。因此,在多线程环境下,应该使用同步机制来保证线程安全。
  2. 文件指针:seek() 方法移动文件指针时需要注意指针的范围,指针的值不能为负数,而且不能超过文件的长度。
  3. 关闭资源:务必使用 close() 方法及时关闭 RandomAccessFile,以释放文件句柄。

RandomAccessFile 的灵活性和随机访问能力使得它成为处理大文件、部分读取文件以及需要频繁定位和修改文件内容的理想工具。

RandomAccessFile简介 RandomAccessFile功能构造函数特殊方法三级目录 功能 想比较之前的流要么读要么写,RandomAccessFile提供了读写操作RandomAccessFile声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了Datalnput、DataOutput两个接口 看源码 public class RandomAccessFile implements DataOutput, DataInput, Closeable 构造函数 public RandomAcce 阅读详情

相关推荐

Java RandomAccessFile的用法详解

下面小编就为大家带来一篇Java RandomAccessFile的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

RandomAccessFile学习笔记

本文将简要介绍这个类的使用,主要包括RandomAccessFile相关的一些概念,常见API的使用,如何利用RandomAccessFile实现一个断点续传的效果RandomAccessFile是什么?是 Java 中用于对文件进行随机访问的类。与普通的输入输出流不同,允许在文件中任意位置读写数据。RandomAccessFile的作用有哪些?随机访问:与其他输入输出流不同,允许在文件中任意位置进行读写操作,可以自由地定位文件指针。读写基本数据类型实现了DataInput和DataOutput。

热爱编程、热爱生活、热爱探索 4528

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

简单光学 2034

RandomAccessFile 详解

RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。 RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(Da...

李昊轩的博客 2916

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

RandomAccessFile类使用详解

RandomAccessFile类使用详解疯狂java讲义读书笔记之RandomAccessFile类的使用详解1.RandomAccessFile特点  RandomAccessFile是java Io体系中功能最丰富的文件内容访问类。即可以读取文件内容,也可以向文件中写入内容。但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。

Simon_night的专栏 1万+

Foxglove 介绍以及入门使用教程

Foxglove 是由Foxglove 工作室开发的一套工具集,包括和等组件。跨平台支持:可以在 Windows、macOS 和 Linux 上运行。多协议兼容:支持 ROS、ROS 2、CAN 数据以及其他自定义协议。丰富的可视化功能:可以绘制点云、轨迹、激光雷达数据、IMU 数据等。实时与离线模式:既可以实时监控机器人状态,也可以加载和回放记录的数据文件。Foxglove 的 3D 视图允许你以三维方式查看机器人的运动轨迹、传感器数据和其他几何信息。你可以旋转、缩放和平移视图以获得更好的观察角度。

zolty 1万+

RandomAccessFile类详解

RandomAccessFile 是 Java IO 体系中一个特殊的文件操作类,它区别于普通的流(InputStream/OutputStream、Reader/Writer),核心优势在于支持随机访问文件内容,可自由定位文件读写位置,兼具读和写的功能。RandomAccessFile 核心优势是随机访问(通过 seek() 控制文件指针),兼具读写能力,不依赖普通 IO 流体系。核心访问模式:“r”(只读)、“rw”(读写,文件不存在自动创建)。

Goolory的博客 795

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6505

FPGA实现Gardner环定时同步:Verilog代码与Testbench实战解析

本文深入解析了在FPGA上实现Gardner环定时同步的完整过程,详细阐述了其非数据辅助的定时误差检测原理。通过Verilog代码实战,展示了内插滤波器、定时误差检测器、环路滤波器和数控振荡器等核心模块的设计,并提供了完整的Testbench验证方法,帮助开发者解决数字通信系统中的时钟同步难题。

gpt4scribbler的博客 576

Java IO——RandomAccessFile类详解

一、RandomAccessFile介绍 RandomAccessFile支持对文件的读取和写入随机访问(其他的输入流或者输出流只能进行一种操作,要么输入,要么输出)。RandomAccessFile把随机访问的文件对象看作存储在文件系统中的一个大型 byte 数组,然后通过指向该 byte 数组的光标或索引(即:文件指针 FilePointer)在该数组任意位置读取或写入任意数据。输入操作从文件指针开始读取字节(以字节为单位进行读取),并随着对字节的读取而前移此文件指针。如果RandomAccessFi

b15735105314的博客 2万+

C#客户端对接工厂MES的方法

本文介绍了使用C#实现WebApi客户端与工厂MES系统交互的方法。主要包括四个步骤:1)配置工控机IP地址;2)获取服务器URL;3)创建HttpHelper帮助类实现单例模式HttpClient,提供异步POST请求方法;4)通过实例化帮助类实现设备状态数据的JSON格式发送与接收。该方案采用异步通信方式,支持超时处理,能够满足大多数MES系统交互需求,帮助工程师快速完成设备与MES系统的数据对接。文中给出了核心代码片段和完整的数据交互流程示例。

weixin_39832501的博客 264

RandomAccessFile的详解

将一个RandomAccessFile对象中的文件指针移动到文件中的一个确定位置,应调用方法?() RandomAccessFile的常见用法

hangge的学习基地 446

24、中性原子量子计算:原理、方法与实验

本文系统介绍了中性原子量子计算的原理、方法与实验进展。重点阐述了利用碱金属原子作为量子比特,通过磁光阱、光偶极阱和光晶格等技术实现原子捕获与控制的方法。同时,详细分析了单量子比特门操作和量子态工程的实现手段,并总结了相关实验结果与未来发展方向。该技术路线为构建大规模量子计算系统提供了可行方案。

ol789012的博客 244

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java IO流详解——RandomAccessFile

一、RandomAccessFile简介 RandomAccessFile既可以读取文件内容,也可以向文件输出数据。同时,RandomAccessFile支持“随机访问”的方式,程序快可以直接跳转到文件的任意地方来读写数据。 由于RandomAccessFile可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将是更好的选择。 与OutputStream、Writer等输出流不同的是,RandomAccessFile允许自由定义文件记录指

weixin_44336181的博客 544

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java中的RandomAccessFile操作详解

#RandomAccessFile类详解 ###RandomAccessFile类是一个对文件进行访问的类,可以进行对文件任意位置进行读写操作,最后一定要使用close()方法对其关闭。 ##构造方法:    RandomAccessFile(String str String Strs)根据str创建一个抽象路径,strs为其中的操作权限,常见的有"r",“w”。    Ra...

xiaolizihao的博客 917

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

File操作 - RandomAccessFile使用详解

RandomAccessFileRandomAccessFile主要完成随机读取的功能,可以读取指定位置的内容。RandomAccessFile不属于InputStream和OutputStream类系的。 实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用Inp

小小默:进无止境 2338
上一篇: 静态代理和动态代理
下一篇: go面向对象
Cxzzzzzzzzzz
博客等级 码龄4年 229粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值