標籤:
目標:
1)掌握RandomAccessFile類的作用。
2)用RandomAccessFile讀取指定位置的資料。
具體內容
RandomAccessFile類的主要功能是完成隨機讀取功能,可以讀取指定範圍的內容。
假設檔案中儲存了以下三個資料:
因為檔案中所有內容都是按照位元組儲存的,都有固定的儲存位置。
構造方法:
public RandomAccessFile(File file,String mode) throws FileNotFoundException
執行個體化此類需要傳遞File類,告訴程式應該操作哪個檔案。之後有一個模式,檔案的開啟模式,
常用的兩種模式:
1) r:讀模式
2)w:寫入模式
3)rw:讀寫入模式,如果使用此模式,如果檔案不存在,則會自動建立。
package Thread1;import java.io.File ;import java.io.RandomAccessFile ;public class demo1{ // 所有的異常直接拋出,程式中不再進行處理 public static void main(String args[]) throws Exception{ //在主方法處使用throws拋出異常給JVM處理,
節省了很多異常處理操作 File f = new File("d:" + File.separator + "test.txt") ; // 指定要操作的檔案 RandomAccessFile rdf = null ; // 聲明RandomAccessFile類的對象 rdf = new RandomAccessFile(f,"rw") ;// 讀寫入模式,如果檔案不存在,會自動建立 String name = null ; int age = 0 ; name = "zhangsan" ; // 字串長度為8 age = 30 ; // 數位長度為4 rdf.writeBytes(name) ; // 將姓名寫入檔案之中 rdf.writeInt(age) ; // 將年齡寫入檔案之中 name = "lisi " ; // 字串長度為8 age = 31 ; // 數位長度為4 rdf.writeBytes(name) ; // 將姓名寫入檔案之中 rdf.writeInt(age) ; // 將年齡寫入檔案之中 name = "wangwu " ; // 字串長度為8 age = 32 ; // 數位長度為4 rdf.writeBytes(name) ; // 將姓名寫入檔案之中 rdf.writeInt(age) ; // 將年齡寫入檔案之中 rdf.close() ; // 關閉 }};
寫入的方法:writeBytes(String str);writeInt(int a);
運行結果:
以上完成了寫入的操作。每條資料都是12位。
寫完開始讀取資料。寫的時候,可以將一個字串寫入(writeBytes(String str)),讀的時候, 需要一個個以位元組讀取出來(readByte())。
跳過幾個位元組的方法:skipBytes(n),向前幾個位元組的方法:seek(0),數組與字串轉換的方法:String str=new String(char b[])。
import java.io.File ;import java.io.RandomAccessFile ;public class RandomAccessFileDemo02{ // 所有的異常直接拋出,程式中不再進行處理 public static void main(String args[]) throws Exception{ File f = new File("d:" + File.separator + "test.txt") ; // 指定要操作的檔案 RandomAccessFile rdf = null ; // 聲明RandomAccessFile類的對象 rdf = new RandomAccessFile(f,"r") ;// 以唯讀方式開啟檔案 String name = null ; int age = 0 ; byte b[] = new byte[8] ; // 開闢byte數組 // 讀取第二個人的資訊,意味著要空出第一個人的資訊 rdf.skipBytes(12) ; // 跳過第一個人的資訊 for(int i=0;i<b.length;i++){ b[i] = rdf.readByte() ; // 讀取一個位元組 } name = new String(b) ; // 將讀取出來的byte數組變為字串,這裡把數組放到string對象中變成String字串。 age = rdf.readInt() ; // 讀取數字 //readInt()讀取的大小恰好是4個位元組,讀取前面8個字串後面的幾個數字。 System.out.println("第二個人的資訊 --> 姓名:" + name + ";年齡:" + age) ; // 讀取第一個人的資訊 rdf.seek(0) ; // 指標回到檔案的開頭 for(int i=0;i<b.length;i++){ b[i] = rdf.readByte() ; // 讀取一個位元組 } name = new String(b) ; // 將讀取出來的byte數組變為字串 age = rdf.readInt() ; // 讀取數字 System.out.println("第一個人的資訊 --> 姓名:" + name + ";年齡:" + age) ; rdf.skipBytes(12) ; // 空出第二個人的資訊 for(int i=0;i<b.length;i++){ b[i] = rdf.readByte() ; // 讀取一個位元組 } name = new String(b) ; // 將讀取出來的byte數組變為字串 age = rdf.readInt() ; // 讀取數字 System.out.println("第三個人的資訊 --> 姓名:" + name + ";年齡:" + age) ; rdf.close() ; // 關閉 }};
運行結果:
第二個人的資訊 --> 姓名:lisi ;年齡:31第一個人的資訊 --> 姓名:zhangsan;年齡:30第三個人的資訊 --> 姓名:wangwu ;年齡:32
如果要完成檔案內容操作,可以使用RoundomAccessFile()完成。
java的IO操作之--RandomAccessFile