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方法異曲同工:
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()方法將一個個位元組寫入):
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:科技優家 |