Java I/O(一)

簡(jiǎn)介

  • 流:流代表任何有能力產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對(duì)象或有能力接收數(shù)據(jù)的接收端對(duì)象递沪,如文件丸冕、網(wǎng)絡(luò)延赌、內(nèi)存等除盏。
  • Java I/O 類庫(kù)的設(shè)計(jì)中采用了裝飾器模式和適配器模式
  • Java I/O 類庫(kù)中的裝飾器模式:FilterInputStream和FilterOutputStream類是Java I/O 類庫(kù)中所有裝飾器的抽象基類,這兩個(gè)類繼承自InputStream和OutputStream挫以,都只是簡(jiǎn)單地重寫了父類中的方法者蠕,而并未提供新功能。通過其子類為被包裝對(duì)象提供新功能掐松。裝飾器模式的使用使得Java I/O 類庫(kù)不那么容易使用踱侣,一般在進(jìn)行I/O操作時(shí),都會(huì)創(chuàng)建不止一個(gè) I/O 對(duì)象甩栈,通過層層包裝泻仙,最后才會(huì)獲得我們真正想要進(jìn)行 I/O 操作的對(duì)象糕再。
    如下面這個(gè)示例量没,為了創(chuàng)建一個(gè)DataInputStream 對(duì)象 從名為"filename"的文件中獲取數(shù)據(jù),首先創(chuàng)建了一個(gè)FileInputStream對(duì)象突想,然后創(chuàng)建了一個(gè)包裝這個(gè)FileInputStream對(duì)象的BufferedInputStream對(duì)象殴蹄,最后通過將BufferedInputStream對(duì)象傳給DataInputStream,才獲得我們真正想要獲得的結(jié)果對(duì)象猾担。
DataInputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream("filename")));
  • Java I/O 類庫(kù)中的適配器模式:InputStreamReader和OutputStreamWriter這兩個(gè)類可以完成“字節(jié)流”和“字符流”之間的適配袭灯,通過使用這兩個(gè)類,就可以將面向“字節(jié)流”的InputStream和OutputStream轉(zhuǎn)化為面向“字符流”的Reader和Writer绑嘹。

InputStream & OutputStream

  • Java最開始的 I/O 類庫(kù)設(shè)計(jì)都是面向字節(jié)流的稽荧,所以在 JDK 1.0 中,I/O 類庫(kù)主要分為兩部分:所有與輸入有關(guān)的類都繼承自 InputStream工腋,所有與輸出有關(guān)的類都繼承自 OutputStream姨丈,InputStream和OutputStream是這些類的抽象基類畅卓。
  • InputStream用于表示那些從不同的數(shù)據(jù)源產(chǎn)生輸入的類,這些輸入源主要有:字節(jié)數(shù)組蟋恬、String對(duì)象翁潘、文件、“管道”歼争、一個(gè)由其他的流所組成的序列拜马、其他數(shù)據(jù)源(Internet等)
  • OutputStream主要用于將數(shù)據(jù)向目標(biāo)輸出,如向文件沐绒、內(nèi)存俩莽、字節(jié)數(shù)組、網(wǎng)絡(luò)等輸出數(shù)據(jù)
    下面兩圖展示了InputStream和OutputStream類層次關(guān)系乔遮,可以看到這兩個(gè)類中包含的子類基本上呈現(xiàn)一一對(duì)應(yīng)的模式豹绪。
InputStream

OutputStream
  • FilterInputStream和FilterOutputStream為“裝飾器”類提供了一個(gè)基類,用于將屬性或有用的接口分別與輸入/輸出流連接起來申眼。

Reader & Writer

  • Java 1.1對(duì)基本的 I/O流類庫(kù)進(jìn)行了重大修改瞒津,添加了一個(gè)面向Unicode字符的Reader和Writer類。設(shè)計(jì)Reader & Writer的目的在于國(guó)際化:舊的InputStream & OutputStream類庫(kù)只能支持8為字節(jié)操作括尸,不能很好地處理16位Unicode字符巷蚪。而16位Unicode字符用于字符國(guó)際化(Java本身的char也是16位Unicode字符),所以添加Reader & Writer繼承層次結(jié)構(gòu)就是為了在所有的I/O操作中都支持Unicode濒翻。同時(shí)新類庫(kù)也比舊類庫(kù)快屁柏。
  • 當(dāng)需要將面向字節(jié)的流與面向字符的流結(jié)合使用時(shí),可以使用Java I/O類庫(kù)中的適配器類:InputStreamReader和OutputStreamWriter有送,通過這兩個(gè)類分別將InputStream和OutputStream轉(zhuǎn)化為Reader和Writer淌喻。
    下面兩圖展示了Reader和Writer類層次關(guān)系:
Reader
Writer

下表展示了在這兩個(gè)繼承層次結(jié)構(gòu)中數(shù)據(jù)來源與去向間的一一對(duì)應(yīng)關(guān)系:

類對(duì)應(yīng)關(guān)系表
過濾器對(duì)應(yīng)關(guān)系表

RandomAccessFile

  • RandomAccessFile是一個(gè)完全獨(dú)立的類,直接繼承自O(shè)bject雀摘,并且實(shí)現(xiàn)了DataOutput和DataInput接口裸删。RandomAccessFile主要適用于由大小已知的記錄所組成的文件,這樣就可以使用seek()方法將記錄從一處移到另一處阵赠。
  • 在 JDK 1.4中涯塔,RandomAccessFile的大多數(shù)功能由nio中的存儲(chǔ)映射文件所取代。
// RandomAccessFile的使用
public class RandomAccessFileTest {
    static void display(RandomAccessFile read) throws IOException {
        byte[] bytes = new byte[16];
        read.seek(0);
        read.read(bytes);
        for (int j = 0; j < bytes.length; j++) {
            printnb((char) bytes[j]);
        }
        print();
        print(read.readBoolean());
        print(read.readInt());
        print(read.readUTF());
    }
    public static void main(String[] args) throws IOException {
        String filename = "raf";
        RandomAccessFile read = new RandomAccessFile(filename, "r");
        RandomAccessFile write = new RandomAccessFile(filename, "rw");
        //執(zhí)行write操作清蚀,向文件--raf中寫入數(shù)據(jù)
        write.seek(0);
        write.writeBytes("RandomAccessFile");
        write.writeBoolean(true);
        write.writeInt(123);
        write.writeUTF("End writing");

        display(read);            // 顯示寫入文件中的數(shù)據(jù)
        write.seek(2);            // 將“光標(biāo)”移到文件的第二個(gè)字節(jié)處
        write.writeChar('k');    // 在“光標(biāo)”當(dāng)前位置寫入字符'k'
        display(read);
      // 關(guān)閉文件
        read.close();
        write.close();
    }
}
//Output:
RandomAccessFile
true
123
End writing
Ra komAccessFile    // 一個(gè)字符占兩個(gè)字節(jié)匕荸,所以文件的第二、三個(gè)字節(jié)用于寫入字符'k'
true
123
End writing

注:

  • 正如上面的代碼所示枷邪,在使用RandomAccessFile時(shí)榛搔,一般需要預(yù)先知道文件的排版,這樣才能正確地操作這個(gè)文件,并很好的利用其隨機(jī)訪問的功能
  • 裝飾器模式:裝飾模式也稱之為包裝器模式(Wrapper)践惑,是一種為已有的功能動(dòng)態(tài)添加新功能的方式绑洛,它把每個(gè)要裝飾的功能都放在一個(gè)單獨(dú)的類中,并讓這個(gè)類包裝它所要裝飾的對(duì)象童本,因此真屯,當(dāng)需要執(zhí)行某些特殊的行為時(shí),客戶端代碼就可以根據(jù)需要有選擇的穷娱、按順序的使用裝飾功能包裝對(duì)象绑蔫。
    優(yōu)點(diǎn):把類中的核心職責(zé)裝飾功能區(qū)分開來,可以有效去除相關(guān)類中的重復(fù)裝飾邏輯代碼泵额。
    缺點(diǎn):需要添加一些額外的裝飾器代碼配深,代碼結(jié)構(gòu)相對(duì)比較復(fù)雜。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫁盲,一起剝皮案震驚了整個(gè)濱河市篓叶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羞秤,老刑警劉巖缸托,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘾蛋,居然都是意外死亡俐镐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門哺哼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佩抹,“玉大人,你說我怎么就攤上這事取董」髌唬” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵茵汰,是天一觀的道長(zhǎng)枢里。 經(jīng)常有香客問我,道長(zhǎng)经窖,這世上最難降的妖魔是什么坡垫? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮画侣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堡妒。我一直安慰自己配乱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搬泥,像睡著了一般桑寨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忿檩,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天尉尾,我揣著相機(jī)與錄音,去河邊找鬼燥透。 笑死沙咏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的班套。 我是一名探鬼主播肢藐,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吱韭!你這毒婦竟也來了吆豹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤理盆,失蹤者是張志新(化名)和其女友劉穎痘煤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猿规,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡速勇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坎拐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦磁。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哼勇,靈堂內(nèi)的尸體忽然破棺而出都伪,到底是詐尸還是另有隱情,我是刑警寧澤积担,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布陨晶,位于F島的核電站,受9級(jí)特大地震影響帝璧,放射性物質(zhì)發(fā)生泄漏先誉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一的烁、第九天 我趴在偏房一處隱蔽的房頂上張望褐耳。 院中可真熱鬧,春花似錦渴庆、人聲如沸铃芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刃滓。三九已至仁烹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咧虎,已是汗流浹背卓缰。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砰诵,地道東北人征唬。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胧砰,于是被迫代替她去往敵國(guó)和親鳍鸵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 說明:參考代碼部分的時(shí)候尉间,請(qǐng)忽略異常處理語句偿乖。I/O中異常的有效處理辦法請(qǐng)看【I/O異常處理】章節(jié) /* * I/...
    Michael_林閱讀 776評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法哲嘲,內(nèi)部類的語法贪薪,繼承相關(guān)的語法,異常的語法眠副,線程的語...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • 一画切、流的概念和作用。 流是一種有順序的囱怕,有起點(diǎn)和終點(diǎn)的字節(jié)集合霍弹,是對(duì)數(shù)據(jù)傳輸?shù)目偝苫虺橄蟆<磾?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,055評(píng)論 2 95
  • 那一天,我第一次為了一個(gè)職業(yè)球員而流淚台丛。 不是因?yàn)樗軅怂=桑撬苓^重傷還砍下60分,因?yàn)樗珗?zhí)成癮的壞脾氣卻縱...
    Seilin閱讀 469評(píng)論 0 2
  • 路途坑坑洼洼挽霉, 你一個(gè)人防嗡,別怕, 至少在你踉蹌摔倒時(shí)沒有人看你笑話侠坎。 前方的路還很長(zhǎng)蚁趁, 你一個(gè)人,別怕硅蹦, 即使沒有...
    AuntyBroken閱讀 217評(píng)論 0 2