【文件處理】RandomAccessFile
阿新 • • 發佈:2017-05-12
top col utf over 出現 director list 代碼 般的
一,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; } publicvoid 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, intage, 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; //創建一個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); //skipBytes()是指在文件中跳過給定數量的字節 Person p = new Person(); p.name = rand.readUTF(); //以UTF的方式讀取 p.age =rand.readInt(); //以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); //通過UTF的方式進行寫入。 System.out.println("name" + rand.getFilePointer()); //打印name所在的指針位置。(因為我們集合中有三個元素對。因此每次循環出來的name指針分別是不同的) rand.writeInt(per.age); //通過int方法進行寫入。 System.out.println("age" + rand.getFilePointer()); //打印age所在的指針位置。 rand.writeBoolean(per.sex); //通過boolean的方法進行寫入。 System.out.println("sex" + rand.getFilePointer()); //打印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]
【文件處理】RandomAccessFile