Java IO流詳解(三)——RandomAccessFile

本篇文章主要介紹RandomAccessFile,該類是IO流體系中功能最豐富的文件內(nèi)容訪問(wèn)類例证,既可以讀取文件內(nèi)容路呜,也可以向文件輸出數(shù)據(jù)。

一、RandomAccessFile簡(jiǎn)介

RandomAccessFile既可以讀取文件內(nèi)容胀葱,也可以向文件輸出數(shù)據(jù)漠秋。同時(shí),RandomAccessFile支持“隨機(jī)訪問(wèn)”的方式抵屿,程序快可以直接跳轉(zhuǎn)到文件的任意地方來(lái)讀寫數(shù)據(jù)庆锦。

由于RandomAccessFile可以自由訪問(wèn)文件的任意位置,所以如果需要訪問(wèn)文件的部分內(nèi)容轧葛,而不是把文件從頭讀到尾搂抒,使用RandomAccessFile將是更好的選擇。

與OutputStream尿扯、Writer等輸出流不同的是求晶,RandomAccessFile允許自由定義文件記錄指針,RandomAccessFile可以不從開始的地方開始輸出衷笋,因此RandomAccessFile可以向已存在的文件后追加內(nèi)容芳杏。如果程序需要向已存在的文件后追加內(nèi)容,則應(yīng)該使用RandomAccessFile辟宗。

RandomAccessFile的方法雖然多爵赵,但它有一個(gè)最大的局限,就是只能讀寫文件泊脐,不能讀寫其他IO節(jié)點(diǎn)空幻。

RandomAccessFile的一個(gè)重要使用場(chǎng)景就是網(wǎng)絡(luò)請(qǐng)求中的多線程下載及斷點(diǎn)續(xù)傳。

二晨抡、RandomAccessFile中的方法

1.RandomAccessFile的構(gòu)造函數(shù)

RandomAccessFile類有兩個(gè)構(gòu)造函數(shù)氛悬,其實(shí)這兩個(gè)構(gòu)造函數(shù)基本相同,只不過(guò)是指定文件的形式不同——一個(gè)需要使用String參數(shù)來(lái)指定文件名耘柱,一個(gè)使用File參數(shù)來(lái)指定文件本身如捅。除此之外,創(chuàng)建RandomAccessFile對(duì)象時(shí)還需要指定一個(gè)mode參數(shù)调煎,該參數(shù)指定RandomAccessFile的訪問(wèn)模式镜遣,一共有4種模式。

**"r" : ** 以只讀方式打開士袄。調(diào)用結(jié)果對(duì)象的任何 write 方法都將導(dǎo)致拋出 IOException悲关。
"rw": 打開以便讀取和寫入。
"rws": 打開以便讀取和寫入娄柳。相對(duì)于 "rw"寓辱,"rws" 還要求對(duì)“文件的內(nèi)容”或“元數(shù)據(jù)”的每個(gè)更新都同步寫入到基礎(chǔ)存儲(chǔ)設(shè)備。
"rwd" : 打開以便讀取和寫入赤拒,相對(duì)于 "rw"秫筏,"rwd" 還要求對(duì)“文件的內(nèi)容”的每個(gè)更新都同步寫入到基礎(chǔ)存儲(chǔ)設(shè)備诱鞠。

2.RandomAccessFile的重要方法

RandomAccessFile既可以讀文件,也可以寫文件这敬,所以類似于InputStream的read()方法航夺,以及類似于OutputStream的write()方法,RandomAccessFile都具備崔涂。除此之外阳掐,RandomAccessFile具備兩個(gè)特有的方法,來(lái)支持其隨機(jī)訪問(wèn)的特性冷蚂。

RandomAccessFile對(duì)象包含了一個(gè)記錄指針缭保,用以標(biāo)識(shí)當(dāng)前讀寫處的位置,當(dāng)程序新創(chuàng)建一個(gè)RandomAccessFile對(duì)象時(shí),該對(duì)象的文件指針記錄位于文件頭(也就是0處),當(dāng)讀/寫了n個(gè)字節(jié)后窗价,文件記錄指針將會(huì)后移n個(gè)字節(jié)矿筝。除此之外,RandomAccessFile還可以自由移動(dòng)該記錄指針。下面就是RandomAccessFile具有的兩個(gè)特殊方法,來(lái)操作記錄指針,實(shí)現(xiàn)隨機(jī)訪問(wèn):

long getFilePointer( ):返回文件記錄指針的當(dāng)前位置
void seek(long pos ):將文件指針定位到pos位置

三苞尝、RandomAccessFile的使用

利用RandomAccessFile實(shí)現(xiàn)文件的多線程下載,即多線程下載一個(gè)文件時(shí)宦芦,將文件分成幾塊宙址,每塊用不同的線程進(jìn)行下載。下面是一個(gè)利用多線程在寫文件時(shí)的例子调卑,其中預(yù)先分配文件所需要的空間抡砂,然后在所分配的空間中進(jìn)行分塊,然后寫入:

/** 
 * 測(cè)試?yán)枚嗑€程進(jìn)行文件的寫操作 
 */  
public class Test {  
  
    public static void main(String[] args) throws Exception {  
        // 預(yù)分配文件所占的磁盤空間恬涧,磁盤中會(huì)創(chuàng)建一個(gè)指定大小的文件  
        RandomAccessFile raf = new RandomAccessFile("D://abc.txt", "rw");  
        raf.setLength(1024*1024); // 預(yù)分配 1M 的文件空間  
        raf.close();  
          
        // 所要寫入的文件內(nèi)容  
        String s1 = "第一個(gè)字符串";  
        String s2 = "第二個(gè)字符串";  
        String s3 = "第三個(gè)字符串";  
        String s4 = "第四個(gè)字符串";  
        String s5 = "第五個(gè)字符串";  
          
        // 利用多線程同時(shí)寫入一個(gè)文件  
        new FileWriteThread(1024*1,s1.getBytes()).start(); // 從文件的1024字節(jié)之后開始寫入數(shù)據(jù)  
        new FileWriteThread(1024*2,s2.getBytes()).start(); // 從文件的2048字節(jié)之后開始寫入數(shù)據(jù)  
        new FileWriteThread(1024*3,s3.getBytes()).start(); // 從文件的3072字節(jié)之后開始寫入數(shù)據(jù)  
        new FileWriteThread(1024*4,s4.getBytes()).start(); // 從文件的4096字節(jié)之后開始寫入數(shù)據(jù)  
        new FileWriteThread(1024*5,s5.getBytes()).start(); // 從文件的5120字節(jié)之后開始寫入數(shù)據(jù)  
    }  
      
    // 利用線程在文件的指定位置寫入指定數(shù)據(jù)  
    static class FileWriteThread extends Thread{  
        private int skip;  
        private byte[] content;  
          
        public FileWriteThread(int skip,byte[] content){  
            this.skip = skip;  
            this.content = content;  
        }  
          
        public void run(){  
            RandomAccessFile raf = null;  
            try {  
                raf = new RandomAccessFile("D://abc.txt", "rw");  
                raf.seek(skip);  
                raf.write(content);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } finally {  
                try {  
                    raf.close();  
                } catch (Exception e) {  
                }  
            }  
        }  
    }  
  
}  

當(dāng)RandomAccessFile向指定文件中插入內(nèi)容時(shí)注益,將會(huì)覆蓋掉原有內(nèi)容。如果不想覆蓋掉溯捆,則需要將原有內(nèi)容先讀取出來(lái)丑搔,然后先把插入內(nèi)容插入后再把原有內(nèi)容追加到插入內(nèi)容后。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末提揍,一起剝皮案震驚了整個(gè)濱河市啤月,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劳跃,老刑警劉巖谎仲,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刨仑,居然都是意外死亡郑诺,警方通過(guò)查閱死者的電腦和手機(jī)绞呈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)间景,“玉大人,你說(shuō)我怎么就攤上這事艺智√纫” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵十拣,是天一觀的道長(zhǎng)封拧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)夭问,這世上最難降的妖魔是什么泽西? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缰趋,結(jié)果婚禮上捧杉,老公的妹妹穿的比我還像新娘。我一直安慰自己秘血,他們只是感情好味抖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灰粮,像睡著了一般仔涩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粘舟,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天熔脂,我揣著相機(jī)與錄音,去河邊找鬼柑肴。 笑死霞揉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘉抒。 我是一名探鬼主播零聚,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼些侍!你這毒婦竟也來(lái)了隶症?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岗宣,失蹤者是張志新(化名)和其女友劉穎蚂会,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耗式,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁住,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年趁猴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪见。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儡司,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出余指,到底是詐尸還是另有隱情捕犬,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布酵镜,位于F島的核電站碉碉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淮韭。R本人自食惡果不足惜垢粮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠粪。 院中可真熱鬧蜡吧,春花似錦、人聲如沸占键。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捞慌。三九已至耀鸦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啸澡,已是汗流浹背袖订。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗅虏,地道東北人洛姑。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像皮服,于是被迫代替她去往敵國(guó)和親楞艾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在龄广,面了一些公司硫眯,掛了不少,但最終還是拿到小米择同、百度两入、阿里、京東敲才、新浪裹纳、CVTE择葡、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,239評(píng)論 11 349
  • 在經(jīng)過(guò)一次沒(méi)有準(zhǔn)備的面試后,發(fā)現(xiàn)自己雖然寫了兩年的android代碼剃氧,基礎(chǔ)知識(shí)卻忘的差不多了敏储。這是程序員的大忌,沒(méi)...
    猿來(lái)如癡閱讀 2,838評(píng)論 3 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法朋鞍,類相關(guān)的語(yǔ)法虹曙,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法番舆,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,622評(píng)論 18 399
  • 二十歲矾踱。 二十歲恨狈,好像也沒(méi)什么不同,朋友有一兩個(gè)呛讲,討厭的人有一兩個(gè)禾怠。 時(shí)光很長(zhǎng),記憶卻斷斷續(xù)續(xù)的贝搁。當(dāng)初...
    雕塑家閱讀 257評(píng)論 0 3
  • 大腦極度缺氧雷逆,眼前一片漆黑弦讽,來(lái)不及回想,便被帶到了同學(xué)家的車上膀哲。我和她往产,三年同學(xué),一年同桌某宪,初三分班仿村,她是年級(jí)第三...
    瀚冰閱讀 713評(píng)論 0 0