閱讀目錄

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è)試目錄和文件

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

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         }

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

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

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

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

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

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);

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

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

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

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é)寫入):

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

5.使用RandomAccessFile類讀出文件內(nèi)容

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

 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);

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

運(yùn)行結(jié)果:seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷培訓(xùn)

前面的亂碼是寫入的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