閱讀目錄
RandomAccessFile類的使用
RandomAccessFile類是java提供的對(duì)文件內(nèi)容的訪問,既可以讀文件,也可以寫文件。
支持隨機(jī)訪問文件,可以訪問文件的任意位置。
RandomAccessFile類實(shí)現(xiàn)步驟
(1)文件模型
第一步要知道,在硬盤上的文件時(shí)是以byte byte byte存儲(chǔ)的,是數(shù)據(jù)的集合。
(2)打開文件
打開文件硬盤上的文件有兩種模式:“rw”(讀寫),“r”(只讀)。可以用RandomAccessFile類來指定打開文件的模式,如:
RandomAccessFile raf = new RandomAccessFile(file,"rw")
因?yàn)镽andomAccessFile類是可以隨機(jī)訪問文件的任意位置的,其本質(zhì)是因?yàn)镽andomAccessFile類提供了一個(gè)文件指針。
文件指針,打開文件時(shí)指針在開頭 pointer = 0;
(3)基本寫方法
RandomAccessFile類里提供了一個(gè)基本的寫方法write(),下面是一個(gè)寫入整形int的例子:
raf.write(int)--->只寫一個(gè)字節(jié)(后8位),同時(shí)指針指向下一個(gè)位置,準(zhǔn)備再次寫入
注意:write()方法對(duì)于字節(jié)以外的類型一次只能寫入一個(gè)字節(jié)的大小,比如要完整寫入一個(gè)int類型,則要使用4次write()方法。但是可以直接寫入一個(gè)字節(jié)數(shù)組,如write(byte[])。
(4)基本讀方法
RandomAccessFile類里提供了一個(gè)基本的讀方法read(),用法和write()相同:
int b = raf.read()--->只讀一個(gè)字節(jié)
(5)關(guān)閉流
文件讀寫完成以后一定要關(guān)閉流(Oracle官方說明),如果不關(guān)閉可能會(huì)產(chǎn)生意想不到的異常!
RandomAccessFile 類的使用案例
上面介紹了基本的RandomAccessFile類使用步驟,接下來我寫一個(gè)案例來實(shí)現(xiàn)一下這些步驟吧。
1.首先在項(xiàng)目下創(chuàng)建測(cè)試目錄和文件
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類,打開剛剛創(chuàng)建的文件,查看文件指針的位置
1 RandomAccessFile raf=new RandomAccessFile(file, "rw");2 //指針的位置3 System.out.println(raf.getFilePointer());
3.使用RandomAccessFile類寫入int類型變量
1 int i=0x7fffffff;//最大的整數(shù)2 //用write方法每次只能寫一個(gè)字節(jié),如果把i寫進(jìn)去就得寫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字符串
定義一個(gè)字符串s
String s="中文";
1)先將字符串轉(zhuǎn)為字節(jié)數(shù)組,再將此數(shù)組寫入
1 byte[] gbk=s.getBytes("utf-16be");2 raf.write(gbk);
注意:這里的編碼格式要按utf-16be,因?yàn)閖ava 的內(nèi)部編碼格式就是這個(gè),否則等下讀出時(shí)會(huì)亂碼。更多關(guān)于編碼問題請(qǐng)閱讀我另一篇文章《計(jì)算機(jī)中的編碼問題》
2)使用writeChars()方法
raf.writeChars(s);
原理:writeChars()是調(diào)用writeChar()方法將字符串s的一個(gè)個(gè)字符寫入文件,而writeChar()的內(nèi)容代碼如下(本質(zhì)都是利用write()方法將一個(gè)個(gè)字節(jié)寫入):
5.使用RandomAccessFile類讀出文件內(nèi)容
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));//打印出字節(jié)數(shù)組 7 //將字節(jié)數(shù)組轉(zhuǎn)為字符串 8 String s1=new String(buf,"utf-16be"); 9 10 System.out.println(s1);
運(yùn)行結(jié)果:
前面的亂碼是寫入的int類型,因?yàn)樽x出時(shí)是字符串的編碼格式,所以int型就無法識(shí)別。如果要讀出int型,就得使用readInt()方法讀出int型變量。此外,RandomAccessFile類還提供了讀出和寫入各種類型的方法,使用方法類似,這里就不再闡述了,有興趣的朋友可以自行嘗試。
注意:
如果要從文件頭開始讀,必須把指針移到頭部,seek()把指針指定到某一位置;
read(byte[] )可以把讀到的字節(jié)都傳入到該字節(jié)數(shù)組中去;
將字節(jié)數(shù)組轉(zhuǎn)為字符串時(shí),主要字符串的編碼格式要與寫入字節(jié)時(shí)的編碼格式相同,否則出現(xiàn)亂碼。
每次寫入和讀出時(shí),文件指針的位置都會(huì)發(fā)生變化,請(qǐng)根據(jù)需要使用指針的位置。
6.關(guān)閉RandomAccessFile類
使用完RandomAccessFile類一定不要忘記關(guān)閉流,非常重要,要養(yǎng)成好習(xí)慣!!
//最后必須關(guān)閉raf.close();
題外話:我在文中提到了一個(gè)有趣的int,那就是在java中最大的int類型。為什么0x7ffffff代表最大的int值呢?
解惑:
每位十六進(jìn)制數(shù)占4bit,因此8位十六進(jìn)制等于32bit(即4個(gè)字節(jié)),剛好是一個(gè)int整型。
F的二進(jìn)制碼為 1111
7的二進(jìn)制碼為 0111
這樣一來,整個(gè)整數(shù) 0x7FFFFFFF 的二進(jìn)制表示就是除了首位是 0,其余都是1。就是說,這是最大的整型數(shù) int(因?yàn)榈谝晃皇欠?hào)位,0 表示它是正數(shù))。
本文如果對(duì)大家的學(xué)習(xí)有幫助,請(qǐng)點(diǎn)擊下方的“推薦”或者“收藏”!您的支持將是我最大的動(dòng)力,謝謝???(●˙?˙●)???再來一個(gè)不要臉的求“關(guān)注”
作者: 云開的立夏
出處: http://www.cnblogs.com/hysum/>
關(guān)于作者:本人目前還在上學(xué),小白一枚,希望能把學(xué)過的知識(shí)與大家分享,請(qǐng)多多賜教!
版權(quán)聲明:本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出 原文鏈接
大家寫文都不容易,請(qǐng)尊重勞動(dòng)成果~這里謝謝大家啦(*/ω\*) 如有問題, 可郵件(hysum626@162.com)咨詢.
http://www.cnblogs.com/hysum/p/7223357.html