當前位置:
首頁 > 知識 > RandomAccessFile類的使用

RandomAccessFile類的使用

RandomAccessFile類的使用

RandomAccessFile類是java提供的對文件內容的訪問,既可以讀文件,也可以寫文件。

支持隨機訪問文件,可以訪問文件的任意位置。

RandomAccessFile類實現步驟

(1)文件模型

第一步要知道,在硬碟上的文件時是以byte byte byte存儲的,是數據的集合。

(2)打開文件

打開文件硬碟上的文件有兩種模式:「rw」(讀寫),「r」(只讀)。可以用RandomAccessFile類來指定打開文件的模式,如:

RandomAccessFile raf = new RandomAccessFile(file,"rw")

因為RandomAccessFile類是可以隨機訪問文件的任意位置的,其本質是因為RandomAccessFile類提供了一個文件指針。

文件指針,打開文件時指針在開頭 pointer = 0;

(3)基本寫方法

RandomAccessFile類里提供了一個基本的寫方法write,下面是一個寫入整形int的例子:

raf.write(int)--->只寫一個位元組(後8位),同時指針指向下一個位置,準備再次寫入

注意:write方法對於位元組以外的類型一次只能寫入一個位元組的大小,比如要完整寫入一個int類型,則要使用4次write方法。但是可以直接寫入一個位元組數組,如write(byte[])。

(4)基本讀方法

RandomAccessFile類里提供了一個基本的讀方法read,用法和write相同:

int b = raf.read--->只讀一個位元組

(5)關閉流

文件讀寫完成以後一定要關閉流(Oracle官方說明),如果不關閉可能會產生意想不到的異常!

RandomAccessFile 類的使用案例

上面介紹了基本的RandomAccessFile類使用步驟,接下來我寫一個案例來實現一下這些步驟吧。

1.首先在項目下創建測試目錄和文件

1 File demo= new File("demo");
2 if(!demo.exists){
3 demo.mkdirs;
4 }
5 File file=new File(demo,"raf.txt");
6 if(!file.exists){
7 file.createNewFile;
8 }

2.初始化RandomAccessFile類,打開剛剛創建的文件,查看文件指針的位置

1 RandomAccessFile raf=new RandomAccessFile(file, "rw");
2 //指針的位置
3 System.out.println(raf.getFilePointer);

3.使用RandomAccessFile類寫入int類型變數

1 int i=0x7fffffff;//最大的整數
2 //用write方法每次只能寫一個位元組,如果把i寫進去就得寫4次
3 raf.write(i>>>24);//高8位
4 raf.write(i>>>16);
5 raf.write(i>>>8);
6 raf.write(i);
7 //也可以直接用writeInt方法,直接寫入,此方法原理同上
8 raf.writeInt(i);

其中writeInt方法的原理也是使用write方法完成的,和我寫的write方法異曲同工:

RandomAccessFile類的使用

4.使用RandomAccessFile類寫入String字元串

定義一個字元串s

String s="中文";

1)先將字元串轉為位元組數組,再將此數組寫入

1 byte gbk=s.getBytes("utf-16be");
2 raf.write(gbk);

注意:這裡的編碼格式要按utf-16be,因為java 的內部編碼格式就是這個,否則等下讀出時會亂碼。更多關於編碼問題請閱讀我另一篇文章《計算機中的編碼問題》

2)使用writeChars方法

raf.writeChars(s);

原理:writeChars是調用writeChar方法將字元串s的一個個字元寫入文件,而writeChar的內容代碼如下(本質都是利用write()方法將一個個位元組寫入):

RandomAccessFile類的使用

5.使用RandomAccessFile類讀出文件內容

1 //讀操作,必須把指針移到頭部
2 raf.seek(0);
3 //一次性讀取
4 byte buf=new byte[(int)raf.length()];
5 raf.read(buf);
6 System.out.println(Arrays.toString(buf));//列印出位元組數組
7 //將位元組數組轉為字元串
8 String s1=new String(buf,"utf-16be");
9
10 System.out.println(s1);

運行結果:

前面的亂碼是寫入的int類型,因為讀出時是字元串的編碼格式,所以int型就無法識別。如果要讀出int型,就得使用readInt方法讀出int型變數。此外,RandomAccessFile類還提供了讀出和寫入各種類型的方法,使用方法類似,這裡就不再闡述了,有興趣的朋友可以自行嘗試。

注意:

  • 如果要從文件頭開始讀,必須把指針移到頭部,seek把指針指定到某一位置;
  • read(byte[] )可以把讀到的位元組都傳入到該位元組數組中去;
  • 將位元組數組轉為字元串時,主要字元串的編碼格式要與寫入位元組時的編碼格式相同,否則出現亂碼。
  • 每次寫入和讀出時,文件指針的位置都會發生變化,請根據需要使用指針的位置。

6.關閉RandomAccessFile類

使用完RandomAccessFile類一定不要忘記關閉流,非常重要,要養成好習慣!!

//最後必須關閉
raf.close;

題外話:我在文中提到了一個有趣的int,那就是在java中最大的int類型。為什麼0x7ffffff代表最大的int值呢?

解惑:

每位十六進位數佔4bit,因此8位十六進位等於32bit(即4個位元組),剛好是一個int整型。

F的二進位碼為 1111

7的二進位碼為 0111

這樣一來,整個整數 0x7FFFFFFF 的二進位表示就是除了首位是 0,其餘都是1。就是說,這是最大的整型數 int(因為第一位是符號位,0 表示它是正數)。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

Jenkins:執行 PowerShell 命令
使用JDBC技術連接資料庫(附源碼)——JAVA的簡單應用
FZU 2253 salty fish

TAG:科技優家 |