C語言中文網 目錄

Java RandomAccessFile類:動態讀取文件內容

< 上一頁Java File類 Java字節流的使用下一頁 >

所謂動態讀取是指從文件的任意位置開始訪問文件,而不是必須從文件開始位置讀取到文件末尾。動態讀取需要用到 Java 中的 RandomAccessFile 類,該類中有一個文件指針用于標識當前流的讀寫位置,這個指針可以向前或者向后移動。

RandomAccessFile 類的構造方法有如下兩種重載形式。
  1. RandomAccessFile(File file,String mode):訪問參數 file 指定的文件,訪問形式由參數 mode 指定,mode 參數有兩個常用的可選值rrw,其中r表示只讀,rw表示讀寫。
  2. RandomAccessFile(String name,String mode):訪問參數 name 指定的文件,mode 參數的含義同上。

RandomAccessFile類中還提供了一系列讀取和寫入數據的方法,表 1 列舉了其中一些 常用方法。

表1 RandomAccessFile類的常用方法
方法名及返回值類型 說明
boolean readBoolean() 從文件中讀取一個 boolean 值
byte readByte() 從文件中讀取一個帶符號位的字節
char readChar() 從文件中讀取一個字符
int readlnt() 從文件中讀取一個帶符號位的整數
long readLong() 從文件中讀取一個帶符號位的 long 值
String readLine() 從文件中讀取下一行文本
void seek(long pos) 指定從文件起始位置開始的指針偏移量
void writeBoolean(boolean v) 以字節的形式向文件中寫入一個 boolean 值
void writeByte(int v) 以單字節的形式向文件中寫入一個 byte 值
void writeChar(int v) 以雙字節的形式向文件中寫入一個 char 值
void writelnt(int v) 以4字節的形式向文件中寫入一個整數
writeLong(long v) 以8字節的形式向文件中寫入一個 long 值
void writeBytes(String s) 以字節序列的形式向文件中寫入一個字符串
void skipBytes(int n) 以當前文件指針位置為起始點,跳過 n 字節

例 1

編寫一個程序,使用 RandomAccessFileDemo 類創建一個 words.txt 文件,然后寫入一個長中文字符串,再從第 4 個字節開始讀取并輸出。

(1) 創建一個 RandomAccessFileDemo 類對象。在 main() 方法中創建到 D:\JavaCodes\ words.txt 的 File 對象,如果該文件已經存在則先刪除再創建,代碼如下所示。
public class RandomAccessFileDemo
{
    public static void main(String[] args)
    {
        try
        {
            File file=new File("D:\\myJava\\words.txt");    //指定文件路徑
            if(file.exists())
            {   //判斷文件是否存在
                file.delete();
                file.createNewFile();
            }
        }
        catch(IOException e)
        {
            System.out.print(e);
        }
    }
}

(2) 創建 RandomAccessFile 對象,以讀寫方式操作 File 對象。定義一個要寫入的字符串,再將其進行格式的轉換。這樣是為了使其寫入文件的內容不出現亂碼,再將轉換后的內容寫入文件,代碼如下所示。
RandomAccessFile raf=new RandomAccessFile(file,"rw");
String str1="晴天,陰天,多云,小雨,大風,中雨,小雪,雷陣雨";    //要寫入的字符串
String str2=new String(str1.getBytes("GBK"),"iso8859-1");    //編碼轉換
raf.writeBytes(str2);    //寫入文件

(3) 打印出當前指針的位置,然后將其移動到第 4 個字節。再定義一個長度為 2 的 byte 數組,然后開始進行內容的循環讀取,將讀出的內容以字符串的形式輸出到控制臺,代碼如下所示。
System.out.println("當前文件指針的位置:"+raf.getFilePointer());
raf.seek(6);    //移動文件指針
System.out.println("從文件頭跳過6個字節,現在文件內容如下:");
byte[] buffer=new byte[2];
int len=0;
while((len=raf.read(buffer,0,2))!=-1)
{
    System.out.print(new String(buffer,0,len));    //輸出文件內容
}

(4) 運行程序,程序運行結果如下所示,顯示了寫入字符串后指針的位置,以及從文件開關跳過 6 個字節后讀取到的字符串,圖 1 為寫入文件中的字符串內容。
當前文件指針的位置:48
從文件頭跳過6個字節,現在文件內容如下:
陰天,多云,小雨,大風,中雨,小雪,雷陣雨


圖1 word.txt文件內容

對比輸出結果和圖 1 發現,中文字符串已成功寫入記事本中,但是讀出的字符串內容少了兩個字和一個逗號,這是由于使用 RandomAccessFile 的 seek() 方法跳過了前 6 字節(1 個漢字占兩字節)。在本程序中將中文字符串進行了編碼轉換,然后再寫入文件。讀取時調用的是帶有 3 個參數的 read() 方法將記事本中的內容讀取出來。

注意:要寫進文本的內容是中文,如果不進行字符的轉換,寫進去的會是亂碼,讀取出來的內容也會是亂碼。
< 上一頁Java File類 Java字節流的使用下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo