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”类比其他的流显得特殊,它可以在字符串中指向任何一个想得到的位置。
【运行效果】
现在要添加数据了!
刚刚加到后面的字符串是:
这个就是学校最好的学生