【文件处理】RandomAccessFile
阅读原文时间:2023年07月18日阅读:1

一,RandomAccessFile的用途:

使用RandomAccessFile的最大好处在于,一般的InputStream和OutputStream类对于文件都是顺序读取的,不能跳跃读取数据。而RandomAccessFile类可以通过seek或者skipBytes方法来读取数据指针,从而达到任意提取数据的效果。另外还可以通过选择不同数据类型的方式来对数据进行读取或者编写。要强调的是如果文件编写时选择的是UTF-8的方式的话,那么读取也必须是通过读取UTF-8的方式。不然会出现乱码。

二,RandomAccessFile的使用案例:

(1)创建Person类,给3个属性。分别是 name,age,sex (数据类型分别为:String, int ,boolean)

package Entiry;

public class Person {

public String name;  
public int age;  
public boolean sex;  
public String getName() {  
    return name;  
}  
public void setName(String name) {  
    this.name = name;  
}  
public int getAge() {  
    return age;  
}  
public void setAge(int age) {  
    this.age = age;  
}  
public boolean isSex() {  
    return sex;  
}  
public void setSex(boolean sex) {  
    this.sex = sex;  
}  
public Person() {  
    super();  
    // TODO Auto-generated constructor stub  
}  
public Person(String name, int age, boolean sex) {  
    super();  
    this.name = name;  
    this.age = age;  
    this.sex = sex;  
}  
@Override  
public String toString() {  
    return "Person \[age=" + age + ", name=" + name + ", sex=" + sex + "\]";  
}

}

(2)创建RandomAccessFile的Test类(方法写到了test类)

package RandomAccess;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

import Entiry.Person;

public class test {

public static void main(String\[\] args) throws IOException {  
    //创建Person数组  
    Person\[\] persons = new Person\[\]{new Person("tony", 18, true),  
    new Person("Jack", 33, true),new Person("Vivian",23, false)  
    };  
    write(persons);     //调用write方法  
    Person p = read(2);  //调用read方法()中的2是指读取第三行的数据。  
    System.out.println(p);

}  
private static List<Long> pointer; &nbsp;//创建一个long型的集合。目的是为了存放不同数据(name,age,sex)之间的指针。  
/\*\*  

  /* 创建read方法(设定指针参数)
  /*
  **/
public static Person read(int i) throws IOException{

    RandomAccessFile rand = new RandomAccessFile("C:/Users/IBM\_ADMIN/Desktop/NewDirectory/liupeng/randomaccess.txt", "r"); //指定读取文件地址,“r”为只读

    long l = pointer.get(i);  
    rand.skipBytes((int)l); &nbsp;//skipBytes()是指在文件中跳过给定数量的字节

    Person p = new Person();

    p.name = rand.readUTF(); //以UTF的方式读取  
    p.age =rand.readInt(); &nbsp; //以int类型读取  
    p.sex = rand.readBoolean(); //以布尔类型读取  
    rand.close();  
    return p;

}

/\*\*  

  /* 创建write方法(把Person[]类作为参数传递过来 persons)
  /*
  **/  
public static void write(Person[] persons) throws IOException{
RandomAccessFile rand = new RandomAccessFile("C:/Users/IBM_ADMIN/Desktop/NewDirectory/liupeng/randomaccess.txt", "rw"); //同样指定读取文件地址,“rw”为读写权限

    pointer = new ArrayList<Long>(); //初始化pointer指针类

    for(Person per:persons){  
        pointer.add(rand.getFilePointer()); //把当前指针记录到集合里。  
        rand.writeUTF(per.name); &nbsp;//通过UTF的方式进行写入。  
        System.out.println("name" + rand.getFilePointer()); //打印name所在的指针位置。(因为我们集合中有三个元素对。因此每次循环出来的name指针分别是不同的)  
        rand.writeInt(per.age); &nbsp; //通过int方法进行写入。  
        System.out.println("age" + rand.getFilePointer()); //打印age所在的指针位置。  
        rand.writeBoolean(per.sex);&nbsp;//通过boolean的方法进行写入。  
        System.out.println("sex" + rand.getFilePointer());&nbsp;//打印sex所在的指针位置。

    }rand.close();  
}

}

(3)结果:

注释:数字分别为每次循环后记录的指针位置,而最后Person [age=23, name=Vivian, sex=false]是 代码中Person p = read(2);  指定的第三个元素的结果。因为第一个元素是从0开始起始的。

name6
age10
sex11
name17
age21
sex22
name30
age34
sex35
Person [age=23, name=Vivian, sex=false]

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章