位置:首页 > Java > RandomAccessFile用法详解与Java随机读写实践

RandomAccessFile用法详解与Java随机读写实践

时间:2026-08-17  |  作者:骑光打字机  |  阅读:0

RandomAccessFile概述

前面介绍的I/O流有一个共同特点,就是只能按照数据的先后顺序读取源设备中的数据,或者按照数据的先后顺序向目标设备写入数据。

但如果希望从文件的任意位置开始执行读写操作,则字节流和字符流都无法实现。

为此,在IO包中,提供了一个RandomAccesseFile类。它不属于流类,但具有读写文件数据的功能,可以随机从文件的任何位置开始执行读写数据的操作。

RandomAccessFile的构造方法

RandomAccessFile可以将文件以指定的操作权限打开,例如只读、可读写等。

具体使用哪种权限,取决于创建它所采用的构造方法,接下来列举RandomAccessFile的构造方法,如表1所示。

表1 RandomAccessFile的构造方法

方法声明 功能描述
RandomAccessFile(File file,String mode) 使用参数file指定被访问的文件,并使用mode来指定访问模式
RandomAccessFile(String name,String mode) 使用参数name指定被访问文件的路径,并使用mode来指定访问模式

表1中列举了创建RandomAccessFile对象的两个构造方法。

通过这两种构造方法创建RandomAccessFile对象时,都需要接受两个参数。

  • 第一个参数指定关联的文件。
  • 第二个参数mode指定访问文件的模式,也就是文件的操作权限。

mode参数的四个取值

参数mode有四个值,这四个值的含义如下:

  • r:表示以只读的方式打开文件。如果试图对RandomAccessFile对象执行写入操作,会抛出IOException异常,
  • rw:表示以“读写”的方式打开文件。如果该文件不存在,则会自动创建该文件。
  • rws:表示以“读写”方式打开文件。与“rw”相比,它要求对文件的内容或元数据的每个更新都同步写入到底层的存储设备。
  • rwd:表示以“读写”方式打开文件。与“rw”相比,它要求对文件的内容的每个更新都同步写入到底层的存储设备。

记录指针机制

RandomAccessFile对象中包含了一个记录指针,用来标识当前读写处的位置。

当程序新建RandomAccessFile对象时,该对象的文件记录指针会在文件开始处,即标识为0的位置。

当读写了n个字节后,文件记录指针会向后移动n个字节。

除了按顺序读写外,RandomAccessFile对象还可以自由移动记录指针。既可以向前移动,也可以向后移动。

RandomAccessFile中的常用方法

RandomAccessFile类针对文件的随机操作,提供了一系列常用方法,如表2所示。

表2 RandomAccesseFile中的常用方法

方法声明 功能描述
long getFilePointer() 返回当前读写指针所处的位置
void seek(long pos) 设定读写指针的位置,与文件开头相隔pos个字节数
int skipBytes(int n) 使读写指针从当前位置开始,跳过n个字节
void write(byte[] b) 将指定的字节数组写入到这个文件,并从当前文件指针开始
void setLength(long newLength) 设置此文件的长度
final String readLine() 从指定文件当前指针读取下一行内容

在表2中,seek(long pos)方法可以使记录指针向前、向后自由移动。

通过RandomAccessFile的getFilePointer()方法,便可获取文件当前记录指针的位置。

应用场景示例

RandomAccessFile在实际开发里其实很常见,尤其适合处理这类“按位置读写数据”的场景。

比如不少软件都是先提供几次免费试用,次数用完后才进入付费使用阶段。

下面就用RandomAccessFile类来模拟这个“记录软件试用次数”的过程。

开始写程序前,先在当前目录下新建一个文本文件“time.txt”,并在文件里写入数字5,表示软件的试用次数。代码如文件1所示。

文件1 Example17.ja va

 1    import ja va.io.*;
 2    public class Example17 {
 3        public static void main(String[] args) throws Exception{
 4            // 创建RandomAccessFile对象,并以读写模式打开time.txt文件
 5            RandomAccessFile raf = new RandomAccessFile("time.txt", "rw");
 6            // 读取还可以使用次数,第一次读取时times为5
 7            int times = Integer.parseInt(raf.readLine())-1;
 8            // 判断剩余次数
 9            if(times > 0){
 10                // 每执行一次代表使用一次,次数就减少一次
 11                System.out.println("您还可以试用"+ times+"次!");
 12                // 将记录指针重新指向文件开头
 13                raf.seek(0);
 14                // 将剩余次数再次写入文件
 15                raf.write((times+"").getBytes());
 16            }else{
 17                System.out.println("试用次数已经用完!");
 18            }
 19            // 关闭这个随机存取文件流并释放任何系统
 20            raf.close();
 21        }
 22    }

上述程序运行两次后的结果如图1所示。

RandomAccessFile用法详解与Java随机读写实践_wishdown.com

图1 运行结果

程序执行过程分析

在文件1里,程序先在当前目录创建一个与“time.txt”关联的RandomAccessFile对象,并把访问模式设为“rw”。

软件运行时,会用变量times来记录还剩多少次可试用;而time.txt里最初写入的次数是5。

每执行一次程序,试用次数就减1,随后把剩余次数提示给用户。

紧接着,调用raf.seek(0)把文件记录指针移回文件开头,再通过write()方法把最新的剩余次数重新写回文件。

等到表示试用次数的times<=0时,程序就会提示“试用次数已经用完!”

最后再调用raf.close()方法关闭文件,这样,整个软件试用次数控制功能就完成了。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多