Java 提供了 RandomAccessFile 類,允許在檔案中的任何位置讀取和寫入資料。到目前為止您使用過的所有流都稱為 只讀 或 只寫 流。這些流稱為順序流。使用順序流開啟的檔案稱為順序存取檔案。順序存取文件的內容無法更新。然而,經常需要修改文件。 Java 提供了 RandomAccessFile 類別來允許在檔案中的任何位置讀取和寫入資料。使用 RandomAccessFile 類別開啟的檔案稱為 隨機存取檔案。
RandomAccessFile類別實作了DataInput和DataOutput接口,如下圖所示。 DataInput 介面定義了讀取原始型別值和字串的方法(例如,readInt、readDouble、readChar、 readBoolean、readUTF)和DataOutput 介面定義了寫入原始型別值和字串的方法(例如,writeInt、writeDouble, writeChar, writeBoolean, writeUTF).
建立RandomAccessFile時,您可以指定兩種模式之一:r或rw。模式r表示該流是唯讀的,模式rw表示該流允許讀和寫。例如,以下語句建立一個新流 raf,允許程式讀取和寫入檔案 test.dat:
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");
如果test.dat已經存在,則創建raf來存取它;如果test.dat不存在,則建立一個名為 test.dat的新文件,並建立raf來存取新文件。 raf.length() 方法傳回任意給定時間 test.dat 中的位元組數。如果將新資料追加到文件中,raf.length() 會增加。
如果不想修改該文件,請使用r模式開啟它。這可以防止無意中修改文件。
隨機存取檔案由位元組序列組成。稱為 檔案指標 的特殊標記位於這些位元組之一。讀取或寫入操作發生在文件指標的位置。開啟檔案時,檔案指標會設定在檔案的開頭。當您向檔案讀取或寫入資料時,檔案指標會向前移動到下一個資料項目。例如,如果使用readInt() 讀取int 值,則JVM 從檔案指標讀取4 位元組,現在檔案指標為比上一個位置提前4字節,如下圖所示。
對於RandomAccessFile raf,可以使用raf.seek(position)方法將檔案指標移到指定位置。 raf.seek(0) 將其移至文件開頭,raf.seek(raf.length()) 將其移至文件末尾。下面的程式碼示範了 RandomAccessFile.
package demo; import java.io.*; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { try( // Create a random access file RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw"); ) { // Clear the file to destroy the old contents if exists inout.setLength(0); // Write new integers to the file for(int i = 0; i目前文件長度為800
第一個數字是 0
第二個數字是 1
第十個數字是 9
新的長度是804
第11個數字是555A RandomAccessFile 是為名為inout.dat 的文件創建的,模式為rw,以允許第8 行中的讀取和寫入操作。
inout.setLength(0) 將長度設定為第 11 行中的 0。這實際上會破壞文件的舊內容。
for循環將200 int值從0到199寫入文件第14行和第15行。 &&&]int 值需要4 位元組,從inout.length() 傳回的檔案總長度現在是800(第18 行),如範例輸出所示。
第 21 行呼叫inout.seek(0) 將檔案指標設定為檔案開頭。 inout.readInt() 讀取第 22 行中的第一個值,並將檔案指標移到下一個數字。第二個數字在第 26 行讀取。
inout.seek(9 * 4)(第 29 行)將文件指標移到第十個數字。 inout.readInt() 讀取第十個數字並將檔案指標移到第 30 行中的第十一個數字。 inout.write(555) 在目前位置寫入新的第十一個數字 (第 33 行)。之前的第十一個數字被銷毀。
inout.seek(inout.length()) 將檔案指標移到檔案結尾(第 36 行)。 inout.writeInt(999) 將 999 寫入檔案(第 37 行)。現在文件的長度增加了 4,因此 inout.length() 返回 804(第 40 行)。
inout.seek(10 * 4) 將檔案指標移到第 43 行中的第十一個數字。新的第十一個數字 555 顯示在第 44 行。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3