標籤:java randomaccessfile
RandomAccessFile:
隨機訪問檔案,自身具備讀寫的方法。通過skipBytes(int x),seek(int x)來達到隨機訪問。
該類不算是IO體系中子類,而是直接繼承自Object
但是它是IO包中成員,因為它具備讀寫功能。
隨機訪問檔案的行為類似儲存在檔案系統中的一個大型 byte 數組。存在指向該隱含數組的游標或索引,稱為檔案指標;輸入操作從檔案指標開始讀取位元組,並隨著對位元組的讀取而前移此檔案指標。如果隨機訪問檔案以讀取/寫入模式建立,則輸出操作也可用;輸出操作從檔案指標開始寫入位元組,並隨著對位元組的寫入而前移此檔案指標。寫入隱含數組的當前末尾之後的輸出操作導致該數組擴充。該檔案指標可以通過 getFilePointer 方法讀取,並通過 seek 方法設定。 通常,如果此類中的所有讀取常式在讀取所需數量的位元組之前已到達檔案末尾,則拋出 EOFException(是一種 IOException)。如果由於某些原因無法讀取任何位元組,而不是在讀取所需數量的位元組之前已到達檔案末尾,則拋出 IOException,而不是 EOFException。需要特別指出的是,如果流已被關閉,則可能拋出 IOException。
構造方法摘要 |
RandomAccessFile(File file, String mode) 建立從中讀取和向其中寫入(可選)的隨機訪問檔案流,該檔案由 File 參數指定。 |
|
RandomAccessFile(String name, String mode) 建立從中讀取和向其中寫入(可選)的隨機訪問檔案流,該檔案具有指定名稱。 |
|
Mode:操作模式
"r" 以唯讀方式開啟。調用結果對象的任何 write 方法都將導致拋出 IOException。
"rw" 開啟以便讀取和寫入。如果該檔案尚不存在,則嘗試建立該檔案。
"rws" 開啟以便讀取和寫入,對於 "rw",還要求對檔案的內容或中繼資料的每個更新都同步寫入到底層存放裝置。
"rwd" 開啟以便讀取和寫入,對於 "rw",還要求對檔案內容的每個更新都同步寫入到底層存放裝置。
如果模式為r(唯讀),不會建立檔案,如果檔案不存在會出現異常
如果模式為rw,檔案不存在會自動建立,如果存在則不會覆蓋
RandomAccessFile支援從任意位置讀寫檔案,這種特性非常符合多線程下載的原理。
假設一個檔案大小為20,那麼開4個線程,每個線程下載5
0--5
6--10
11-15
16--20
建立RandomAccessFile對象:
RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");
讀寫方法:
raf.write("張三".getBytes());raf.writeInt(97);byte buff[] = new byte[4];raf.read(buff);
調整對象中指標
raf.seek(8);
跳過指定的位元組數
raf.skipBytes(8);
舉個栗子:
public class RandomAccessFileDemo {public static void main(String[] args) throws Exception {writeFile();//// readFile();// writeFile2();// 從指定位置開始寫檔案writeFile3();// 從原檔案中間開始寫檔案,會覆蓋當前指標之後的同等長度內容}private static void writeFile3() throws Exception {RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");// seek 和 skipBytes 兩個方法都會覆蓋之後的內容// raf.seek(8);raf.skipBytes(8);raf.write("老李".getBytes());raf.write(102);raf.close();}public static void writeFile2() throws Exception {RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");// 從24個位元組之後開始寫raf.seek(8 * 3);raf.write("周期".getBytes());raf.write(103);}public static void readFile() throws Exception {RandomAccessFile raf = new RandomAccessFile("data.txt", "r");// raf.write("hahaha".getBytes());// 調整對象中指標// raf.seek(8);// 從第8個位元組開始讀檔案,讀出來的是李斯// 跳過指定的位元組數// raf.skipBytes(8);byte buff[] = new byte[4];raf.read(buff);String s = new String(buff);System.out.println("name = " + s);int age = raf.readInt();System.out.println("age = " + age);raf.close();}public static void writeFile() throws Exception {RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");raf.write("張三".getBytes());raf.writeInt(97);raf.write("李斯".getBytes());raf.writeInt(99);raf.close();}}
Java---31---RadnomAccessFile