日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1.5 RandomAccessFile类:动态读取文件内容

發(fā)布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.5 RandomAccessFile类:动态读取文件内容 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

所謂動態(tài)讀取是指從文件的任意位置開始訪問文件,而不是必須從文件開始位置讀取到文件末尾。動態(tài)讀取需要用到 Java 中的 RandomAccessFile 類。

RandomAccessFile 是 Java 輸入/輸出流體系中功能最豐富的文件內容訪問類,它提供了眾多的方法來訪問文件內容,它既可以讀取文件內容,也可以向文件輸出數(shù)據(jù)。由于 RandomAccessFile 可以從任意位置訪問文件,所以在只需要訪問文件部分內容的情況下,使用 RandonAccessFile 類是一個很好的選擇。

RandomAccessFile 對象包含了一個記錄指針,用以標識當前讀寫處的位置,當程序新創(chuàng)建一個 RandomAccessFile 對象時,該對象的文件記錄指針位于文件頭(也就是 0 處),當讀/寫了 n 個字節(jié)后,文件記錄指針將會向后移動 n 個字節(jié)。除此之外,RandonAccessFile 可以自由移動該記錄指針,既可以向前移動,也可以向后移動。

RandomAccessFile 類中提供了一些常用讀取和寫入數(shù)據(jù)的方法,如表 1 所示。

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

RandomAccessFile 類的構造方法有如下兩種重載形式。

  • RandomAccessFile(File file, String mode):訪問參數(shù) file 指定的文件,訪問形式由參數(shù)mode 指定,mode 參數(shù)有兩個常用的可選值 r 和 rw,其中 r 表示只讀,rw 表示讀寫。
  • RandomAccessFile(String name, String mode):訪問參數(shù) name 指定的文件,mode參數(shù)的含義同上。
  • 注意:如果使用 rw 方式聲明 RandomAccessFile 對象時,要寫入的文件不存在,系統(tǒng)將自動進行創(chuàng)建。

    例 1
    編寫一個程序,使用 RandomAccessFileDemo 類創(chuàng)建一個 words.txt 文件,然后寫入一個長中文字符串,再從第 6 個字節(jié)開始讀取并輸出。

    1)創(chuàng)建一個 RandomAccessFileDemo 類對象。在 main() 方法中創(chuàng)建到 H:\JavaCodes\words.txt 的 File 對象,如果該文件已經(jīng)存在則先刪除再創(chuàng)建,代碼如下所示。

    public class RandomAccessFileDemo {public static void main(String[] args) {File file = new File("H:\\myJava\\words.txt"); // 指定文件路徑if (file.exists()) { // 判斷文件是否存在file.delete();}try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

    2)創(chuàng)建 RandomAccessFile 對象,以讀寫方式操作 File 對象。定義一個要寫入的字符串,再將其進行格式的轉換。這樣是為了使其寫入文件的內容不出現(xiàn)亂碼,再將轉換后的內容寫入文件,代碼如下所示。

    import java.io.File; import java.io.IOException; import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) throws IOException {File file = new File("H:\\myJava\\words.txt"); // 指定文件路徑if (f.exists()) // 判斷文件是否存在{f.delete(); // 存在則先刪除}f.createNewFile(); // 再創(chuàng)建RandomAccessFile raf = new RandomAccessFile(f,"rw");String str1 = "晴天,陰天,多云,小雨,大風,中雨,小雪,雷陣雨"; // 要寫入的字符串String str2 = new String(str1.getBytes("GBK"),"ISO-8859-1"); // 編碼轉換raf.writeBytes(str2); //寫入文件} }

    3)打印出當前指針的位置,然后將其移動到第 6 個字節(jié)。再定義一個長度為 2 的 byte 數(shù)組,然后開始進行內容的循環(huán)讀取,將讀出的內容以字符串的形式輸出到控制臺,代碼如下所示。

    System.out.println("當前文件指針的位置:" + raf.getFilePointer()); raf.seek(6); // 移動文件指針 System.out.println("從文件頭跳過6個字節(jié),現(xiàn)在文件內容如下:"); 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 個字節(jié)后讀取到的字符串,圖 1 為寫入文件中的字符串內容。

    當前文件指針的位置:48 從文件頭跳過6個字節(jié),現(xiàn)在文件內容如下: 陰天,多云,小雨,大風,中雨,小雪,雷陣雨


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

    注意:要寫進文本的內容是中文,如果不進行字符的轉換,寫進去的會是亂碼,讀取出來的內容也會是亂碼。

    《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的1.5 RandomAccessFile类:动态读取文件内容的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。