No.20 線程中的IO流

簡(jiǎn)介:

PipedInputStream/PipedReader :管道輸入流嗤无,主要在線程中使用 . 管道輸入流是指一個(gè)通訊管道的接收端(Receiver)酱虎。
PipedOutputStream/PipedWriter :管道輸出流舅柜,指在一個(gè)通訊管道的發(fā)送端(Sender)
主要應(yīng)用:一個(gè)線程通過(guò)管道輸出流發(fā)送數(shù)據(jù)肛循,而另一個(gè)線程通過(guò)管道輸入流讀取數(shù)據(jù)口蝠,這樣可實(shí)現(xiàn)兩個(gè)線程間的通訊祷杈。

使用方法:

(1)在使用管道輸出流和管道輸入流時(shí)需要定義兩個(gè)線程類(實(shí)現(xiàn)Runnable或繼承Thread)
(2)在線程的發(fā)送端(Sender)內(nèi)部,定義管道輸出流:

public class Sender implements Runnable{

private PipedOutputStream pos;
//建立一個(gè)輸出流對(duì)象通過(guò)發(fā)送端的構(gòu)造函數(shù)傳遞
Sender(PipedOutputStream pos){
    this.pos = pos;
}

@Override
public void run() {
    //寫(xiě)入到輸出流中
    for(int i = 75;i < 90 ;i++){
        try {
            pos.write(i);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        //寫(xiě)完記得關(guān)閉流對(duì)象
        pos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
}

(3)在線程的接收端內(nèi)部谴餐,定義管道輸入流:

public class Receiver implements Runnable{

private PipedInputStream pis = null;
//建立構(gòu)造函數(shù)傳遞一個(gè)管道輸入流對(duì)象捌显。
Receiver(PipedInputStream pis){
    this.pis = pis;
}
//實(shí)現(xiàn)線程部分代碼:
@Override
public void run() {
    int len = 0;
    //讀取管道內(nèi)的數(shù)據(jù)
    try {
        while((len = pis.read()) != -1){
            
            System.out.println("Random: "  + (char)len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        pis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

(4)在主線程中需要完成:1)管道流的實(shí)例對(duì)象的生成;2)管道流的連接总寒;3)實(shí)例化線程的接收端和發(fā)送端并把管道流傳遞進(jìn)去;4)開(kāi)啟線程理肺。

public class Test {
public static void main(String[] args) throws IOException {
    //分別創(chuàng)建輸入流/輸出流
    PipedOutputStream pos = new PipedOutputStream();
    PipedInputStream pis = new PipedInputStream();
    //鏈接輸入輸出流
    pos.connect(pis);
    //實(shí)例化發(fā)送端接收端
    Sender sender = new Sender(pos);
    Receiver receiver = new Receiver(pis);
    //創(chuàng)建并啟動(dòng)線程
    new Thread(sender).start();;
    new Thread(receiver).start();;

  } 
}

同樣字符流應(yīng)用在管道流中摄闸,下面就舉一個(gè)列子利用管道流進(jìn)行文件的復(fù)制:
接收端代碼:線程的接收端-->管道輸出端-->文件的輸入端;

/**
 * 從管道輸入流中讀取數(shù)據(jù)妹萨,利用文件輸出流寫(xiě)到文件中
 */
public class Receiver implements Runnable {
// 建立字符管道輸入流年枕,文件輸出流,
private PipedReader pr = null;
private FileWriter fw;
private File file;

// 構(gòu)造參數(shù)接受一個(gè)管道輸入流乎完,和一個(gè)File對(duì)象作為輸出文件的地址
Receiver(PipedReader pr, File file) {
    this.pr = pr;
    this.file = file;
}

// 實(shí)現(xiàn)線程部分代碼:
@Override
public void run() {
    try {
        fw = new FileWriter(file);
    } catch (IOException e) {
        System.out.println("文件不存在");
    }

    // 讀取管道內(nèi)的數(shù)據(jù)熏兄,并寫(xiě)入文件輸出流中
    int data = 0;
    try {
        while ((data = pr.read()) != -1) {
            fw.write((char) data);
            fw.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    //關(guān)閉流
    try {
        fw.close();
        pr.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }

  }
}

發(fā)送端代碼:線程的發(fā)送端-->管道輸入端-->文件的輸出端;

/**
 * 從文件中讀出數(shù)據(jù)進(jìn)入文件輸入流,并把文件輸出流中的數(shù)據(jù)寫(xiě)入管道輸出流中
 */
public class Sender implements Runnable {
private File file;
private FileReader fr;
private PipedWriter pw;

Sender(PipedWriter pw, File file) {
    this.pw = pw;
    this.file = file;
}

@Override
public void run() {
    try {
        fr = new FileReader(file);
        int data = 0;
        while ((data = fr.read()) != -1) {
            pw.write((char) data);
            pw.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        fr.close();
        pw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

  }
}

主線程代碼:

public class Test {
public static void main(String[] args) throws IOException {
    File R_file = new File("d://text.txt");
    File S_file = new File("d://sc.txt");
    
    //分別創(chuàng)建輸入流/輸出流
    PipedReader pr = new PipedReader();
    PipedWriter pw = new PipedWriter();
    //鏈接輸入輸出流
    pr.connect(pw);
    //實(shí)例化發(fā)送端接收端
    Sender sender = new Sender(pw,R_file);
    Receiver receiver = new Receiver(pr,S_file);
    //創(chuàng)建并啟動(dòng)線程
    new Thread(sender).start();;
    new Thread(receiver).start();;

  } 
}

可以看到:IO操作在實(shí)際應(yīng)用的過(guò)程中可能會(huì)因?yàn)樾枨笄短资褂媚ν啊>唧w什么時(shí)候該選擇什么流對(duì)象桥状,在IO最后會(huì)有總結(jié);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硝清,一起剝皮案震驚了整個(gè)濱河市辅斟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦拿,老刑警劉巖士飒,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔗崎,居然都是意外死亡酵幕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門缓苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芳撒,“玉大人,你說(shuō)我怎么就攤上這事他嫡》伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵钢属,是天一觀的道長(zhǎng)徘熔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)淆党,這世上最難降的妖魔是什么酷师? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮染乌,結(jié)果婚禮上山孔,老公的妹妹穿的比我還像新娘。我一直安慰自己荷憋,他們只是感情好台颠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勒庄,像睡著了一般串前。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上实蔽,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天荡碾,我揣著相機(jī)與錄音,去河邊找鬼局装。 笑死坛吁,一個(gè)胖子當(dāng)著我的面吹牛劳殖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拨脉,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哆姻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了女坑?” 一聲冷哼從身側(cè)響起填具,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匆骗,沒(méi)想到半個(gè)月后劳景,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碉就,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盟广,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓮钥。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筋量,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碉熄,到底是詐尸還是另有隱情桨武,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布锈津,位于F島的核電站呀酸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琼梆。R本人自食惡果不足惜性誉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茎杂。 院中可真熱鬧错览,春花似錦、人聲如沸煌往。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刽脖。三九已至悼粮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曾棕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工菜循, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翘地,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衙耕,于是被迫代替她去往敵國(guó)和親昧穿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理橙喘,服務(wù)發(fā)現(xiàn)时鸵,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,747評(píng)論 25 707
  • 從三月份找實(shí)習(xí)到現(xiàn)在厅瞎,面了一些公司饰潜,掛了不少,但最終還是拿到小米和簸、百度彭雾、阿里、京東锁保、新浪薯酝、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,209評(píng)論 11 349
  • “#本文參加‘青春’大賽爽柒,本人保證本文為本人原創(chuàng)吴菠,如有問(wèn)題則與主辦方無(wú)關(guān),自愿放棄評(píng)優(yōu)評(píng)獎(jiǎng)資格”浩村。 贛南師范大學(xué) ...
    啊小蘇蘇閱讀 480評(píng)論 8 21
  • 我跟mary 講著千篇一律的話做葵,讓她找個(gè)對(duì)象的話,請(qǐng)我吃飯穴亏。 我跟別人講蜂挪,大家都說(shuō),好好好嗓化,一定一定棠涮。 Mary ...
    學(xué)到夜深人靜時(shí)DZR閱讀 155評(píng)論 0 0