15.6.9 随机文件访问RandomAccessFile类的使用

“RandomAccessFile”类就是随机文件访问类。所谓的随机文件访问,就是指可以读写任意位置数据的文件,如何访问任意位置的数据呢?通过文件指针。通过移动文件指针,来达到随机访问的目的。

“RandomAccessFile”类实现了“Datainput”与“Dataoutput”接口,所以可以读取基本数据类型的数据。为了能够随机访问,必须先创建对象。下面看看“RandomAccessFile”类的构造器。


public RandomAccessFile(String name, String mode)

public RandomAccessFile(File file, String mode)


使用给定的字符串或文件对象和存取模式创建一个RandomAccessFile类对象。

对于“RandomAccessFile”类的存取模式,总共有四种,分别是“r”、“rw”、“rws”、“rwd”。“r”代表以只读方式打开文件,若此时进行写操作会出错;“rw”、“rws”、“rwd”是以读写模式打开文件,若文件不存在,则创建它。

创建完了对象后,就要使用“RandomAccessFile”类的方法来操作数据。下面介绍有关这个类的方法。

public native long getFilePointer():取到文件位置指针。

public native void seek(long pos):将文件位置指针移至pos处,pos以字节为单位。

public native long length():获取文件大小,以字节为单位。

readBoolean(),readByte(),readChar(),readShort(),readInt(),readLong(),readFloat(),readDouble(),readU TF():读取不同类型的数据。

write(int b),writeBoolean(boolean v),writeByte(byte v),writeChar(char v),writeShort(short v),writeInt(int v),writeLong(long v),writeFloat(float v),writeDouble(double v),writeUTF(String str):将不同类型的数据输出到文件。

【实例15.21】了解上述理论知识后,下面来看一个有关“RandomAccessFile”类的实例。


01 import java.io.*;

02 ///创建一个文件类对象

03 ///创建一个随机访问类对象raf

04 ///利用raf写入不同的数据类型的数据到f中

05 public class file20

06 {

07 public static void main(String[]args)throws Exception

08 {

09 File f=new File("d://raf.txt");

10 RandomAccessFile raf=new RandomAccessFile(f,"rw");

11 int x=4;

12 char c=’a’;

13 long l=123;

14 float fl=3.4F;

15 double d=4.222D;

16 String str="这些都是基本数据类型的数据";

17 raf.writeInt(x);

18 raf.writeChar(c);

19 raf.writeLong(l);

20 raf.writeFloat(fl);

21 raf.writeDouble(d);

22 raf.writeUTF(str);

23 raf.close();

24 System.out.println("文件已经创建完毕!");

25 }

26 }


【代码说明】第11~15行创建6种类型的数据,然后第17~22行将这些数据输入到raf.txt中。第24行在控制台输出提示信息。

【运行效果】


文件已经创建完毕!


上面的程序段运行后,会把数据写到文本文件raf.txt中,读者可以到此文件中查看结果。

【实例15.22】下面再看一个实例,使用这个类从文本文件中读取文件数据。


01 import java.io.*;

02 ///创建一个文件类对象

03 ///创建一个随机访问类对象raf

04 ///利用raf读取不同的数据类型的数据

05 public class file21

06 {

07 public static void main(String[]args)throws Exception

08 {

09 File f=new File("d://raf.txt");

10 RandomAccessFile raf=new RandomAccessFile(f,"rw");

11 //int x=4;

12 //char c=’a’;

13 //long l=123;

14 //float fl=3.4F;

15 //double d=4.222D;

16 //String str="这些都是基本数据类型的数据";

17 System.out.println(raf.readInt());

18 System.out.println(raf.readChar());

19 System.out.println(raf.readLong());

20 System.out.println(raf.readFloat());

21 System.out.println(raf.readDouble());

22 System.out.println(raf.readUTF());

23 raf.close();

24 System.out.println("这就是文件的内容!");

25 }

26 }


【代码说明】第9行创建文件类对象f,因为已经创建了raf.txt文件,所以这里注释掉第11~16行,然后通过第17~22行从文件中读取数据。

【运行效果】


4 a

123 3.4

4.222

这些都是基本数据类型的数据

这就是文件的内容!


【实例15.23】上面的实例还不能真正地体现出RandomAccessFile类的作用。下面再举一个实例,来学习如何利用文件指针来操作数据。


01 import java.io.*;

02 ///创建一个文件类对象f

03 ///创建一个随机访问类对象raf

04 ///让raf的指针指向内部数据的末端

05 public class file22

06 {

07 public static void main(String[]args)throws Exception

08 {

09 File f=new File("d://raf.txt");

10 RandomAccessFile raf=new RandomAccessFile(f,"rw");

11 String s="这个就是学校最好的学生";

12 System.out.println("现在要添加数据了!");

13 try

14 {

15 long l=raf.length();

16 raf.seek(l);

17 raf.writeUTF(s);

18 System.out.println("刚刚加到后面的字符串是:");

19 raf.seek(l);

20 System.out.println(raf.readUTF());

21 raf.seek(0);

22 System.out.println(raf.readUTF());

23 raf.close();

24 }

25 catch(Exception e)

26 {}

27 }

28 }


【代码说明】上面的这个程序,主要是通过指针指向原先数据的末端,然后再添加数据。这个实例将文件指针的用法展现出来了,由于文件指针的灵活性,使得“RandomAccessFile”类比其他的流显得特殊,它可以在字符串中指向任何一个想得到的位置。

【运行效果】


现在要添加数据了!

刚刚加到后面的字符串是:

这个就是学校最好的学生