学科分类
目录
Java基础

RandomAccessFile

前面介绍的I/O流有一个共同特点,就是只能按照数据的先后顺序读取源设备中的数据,或者按照数据的先后顺序向目标设备写入数据,但如果希望从文件的任意位置开始执行读写操作,则字节流和字符流都无法实现。为此,在IO包中,提供了一个RandomAccesseFile类,它不属于流类,但具有读写文件数据的功能,可以随机从文件的任何位置开始执行读写数据的操作。

RandomAccessFile可以将文件以指定的操作权限(如只读、可读写等)的方式打开,具体使用哪种权限取决于创建它所采用的构造方法,接下来列举RandomAccessFile的构造方法,如表1所示。

表1 RandomAccessFile的构造方法

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

表1中,列举了创建RandomAccessFile对象的两个构造方法。通过这两种构造方法创建RandomAccessFile对象时,都需要接受两个参数,第一个参数指定关联的文件,第二个参数mode指定访问文件的模式,也就是文件的操作权限。

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

● r:表示以只读的方式打开文件。如果试图对RandomAccessFile对象执行写入操作,会抛出IOException异常,

● rw:表示以“读写”的方式打开文件。如果该文件不存在,则会自动创建该文件。

● rws:表示以“读写”方式打开文件。与“rw”相比,它要求对文件的内容或元数据的每个更新都同步写入到底层的存储设备。

● rwd:表示以“读写”方式打开文件。与“rw”相比,它要求对文件的内容的每个更新都同步写入到底层的存储设备。

RandomAccessFile对象中包含了一个记录指针来标识当前读写处的位置。当程序新建RandomAccessFile对象时,该对象的文件记录指针会在文件开始处(即标识为0的位置),当读写了n个字节后,文件记录指针会向后移动n个字节。除了按顺序读写外,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.java

 1    import java.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所示。

图1 运行结果

在文件1中,在当前目录下创建了一个RandomAccessFile对象关联访问的文件“time.txt”,并设置为“rw”的访问模式。在使用软件时,使用变量times记录软件能够试用的次数,time.txt中原本记录次数为5,每执行一次程序,软件会把试用次数减1,同时提示用户剩余试用次数,然后通过调用raf.seek(0)方法把文件的记录指针跳转到文件头的位置,并通过write()方法将剩余的次数重新写入文件。当表示试用的次数times<=0时,则提示“试用次数已经用完!”。最后调用raf.close()方法关闭,便完成了软件试用的功能。

点击此处
隐藏目录