使用隨機訪問文件,我們可以從文件讀取以及寫入文件。使用文件輸入和輸出流的讀取和寫入是順序過程。使用隨機訪問文件,可以在文件中的任何位置讀取或?qū)懭搿?br>RandomAccessFile
類的一個對象可以進(jìn)行隨機文件訪問。可以讀/寫字節(jié)和所有原始類型的值到一個文件。
RandomAccessFile
可以使用其readUTF()
和writeUTF()
方法處理字符串。RandomAccessFile
類不在InputStream
和OutputStream
類的類層次結(jié)構(gòu)中。
可以在四種不同的訪問模式中創(chuàng)建隨機訪問文件。訪問模式值是一個字符串。 它們列出如下:
模式 | 含義 |
---|---|
“r” | 文件以只讀模式打開。 |
“rw” | 該文件以讀寫模式打開。 如果文件不存在,則創(chuàng)建該文件。 |
“rws” | 該文件以讀寫模式打開。 對文件的內(nèi)容及其元數(shù)據(jù)的任何修改就會立即被寫入存儲設(shè)備。 |
“rwd” | 該文件以讀寫模式打開。 對文件內(nèi)容的任何修改都會立即寫入存儲設(shè)備。 |
通過指定文件名和訪問模式來創(chuàng)建RandomAccessFile
類的實例。
RandomAccessFile raf = new RandomAccessFile("randomtest.txt", "rw");
隨機訪問文件具有文件指針,當(dāng)從其讀取數(shù)據(jù)或向其寫入數(shù)據(jù)時,文件指針向前移動。文件指針是下一次讀取或?qū)懭雽㈤_始的光標(biāo)。其值指示光標(biāo)與文件開頭的距離(以字節(jié)為單位)。
可以通過使用其getFilePointer()
方法來獲取文件指針的值。當(dāng)創(chuàng)建一個RandomAccessFile
類的對象時,文件指針被設(shè)置為零??梢允褂?code>seek()方法將文件指針設(shè)置在文件中的特定位置。
RandomAccessFile
類的length()
方法返回文件的當(dāng)前長度??梢酝ㄟ^使用其setLength()
方法來擴展或截斷文件。
以下代碼顯示如何使用RandomAccessFile
對象讀取和寫入文件。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Main {
public static void main(String[] args) throws IOException {
String fileName = "randomaccessfile.txt";
File fileObject = new File(fileName);
if (!fileObject.exists()) {
initialWrite(fileName);
}
readFile(fileName);
readFile(fileName);
}
public static void readFile(String fileName) throws IOException {
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
int counter = raf.readInt();
String msg = raf.readUTF();
System.out.println(counter);
System.out.println(msg);
incrementReadCounter(raf);
raf.close();
}
public static void incrementReadCounter(RandomAccessFile raf)
throws IOException {
long currentPosition = raf.getFilePointer();
raf.seek(0);
int counter = raf.readInt();
counter++;
raf.seek(0);
raf.writeInt(counter);
raf.seek(currentPosition);
}
public static void initialWrite(String fileName) throws IOException {
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
raf.writeInt(0);
raf.writeUTF("Hello world!");
raf.close();
}
}
上面的代碼生成以下結(jié)果。
0
Hello world!
1
Hello world!