成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java IO學(xué)習(xí)五

gaomysion / 1390人閱讀

摘要:不建議對(duì)這兩個(gè)對(duì)象嘗試使用單個(gè)線程,因?yàn)檫@樣可能會(huì)造成該線程死鎖。構(gòu)造函數(shù)創(chuàng)建尚未連接到管道輸入流的管道輸出流。通常,數(shù)據(jù)由某個(gè)線程從對(duì)象讀取,并由其他線程將其寫入到相應(yīng)的。

管道流

管道流的主要作用是可以進(jìn)行兩個(gè)線程間的通訊,分為管道輸出流(PipedOutputStream)、管道輸入流(PipedInputStream),如果想要進(jìn)行管道輸出,則必須要把輸出流連在輸入流之上,在PipedOutputStream類上有如下的一個(gè)方法用于連接管道:
public void connect(PipedInputStream snk)throws IOException

通常是創(chuàng)建兩個(gè)多帶帶的線程來(lái)實(shí)現(xiàn)通信,如果是單個(gè)線程的話容易出現(xiàn)線程堵塞,因?yàn)檩敵隽髯疃嘀荒芟蚓彌_區(qū)寫入1024個(gè)字節(jié)的數(shù)據(jù),如果超出就會(huì)出現(xiàn)線程堵塞,因此必須創(chuàng)建多個(gè)線程實(shí)現(xiàn)緩沖區(qū)的釋放和存儲(chǔ)

PipedOutputStream

管道輸出流是管道的發(fā)送端,可以將管道輸出流連接到管道輸入流來(lái)創(chuàng)建一個(gè)通信管道,通常,數(shù)據(jù)由某個(gè)線程寫入 PipedOutputStream 對(duì)象,并由其他線程從連接的 PipedInputStream 讀取。不建議對(duì)這兩個(gè)對(duì)象嘗試使用單個(gè)線程,因?yàn)檫@樣可能會(huì)造成該線程死鎖。如果某個(gè)線程正從連接的管道輸入流中讀取數(shù)據(jù)字節(jié),但該線程不再處于活動(dòng)狀態(tài),則該管道被視為處于 毀壞 狀態(tài)。

構(gòu)造函數(shù)

PipedOutputStream() 創(chuàng)建尚未連接到管道輸入流的管道輸出流。

PipedOutputStream(PipedInputStream snk) 創(chuàng)建連接到指定管道輸入流的管道輸出流。

常用函數(shù)

close() 關(guān)閉

void connect(PipedInputStream snk) 將此管道輸出流連接到接收者。

void flush() 刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)。

void write(byte[] b, int off, int len)len 字節(jié)從初始偏移量為 off 的指定 byte 數(shù)組寫入該管道輸出流。

void write(int b) 將指定 byte 寫入傳送的輸出流。

PipedInputStream

管道輸入流應(yīng)該連接到管道輸出流;管道輸入流提供要寫入管道輸出流的所有數(shù)據(jù)字節(jié)。通常,數(shù)據(jù)由某個(gè)線程從 PipedInputStream 對(duì)象讀取,并由其他線程將其寫入到相應(yīng)的 PipedOutputStream。不建議對(duì)這兩個(gè)對(duì)象嘗試使用單個(gè)線程,因?yàn)檫@樣可能死鎖線程。管道輸入流包含一個(gè)緩沖區(qū),可在緩沖區(qū)限定的范圍內(nèi)將讀操作和寫操作分離開。 如果向連接管道輸出流提供數(shù)據(jù)字節(jié)的線程不再存在,則認(rèn)為該管道已損壞。

構(gòu)造函數(shù)

PipedInputStream() 創(chuàng)建尚未連接的 PipedInputStream。

PipedInputStream(PipedOutputStream src) 創(chuàng)建 PipedInputStream,使其連接到管道輸出流 src。

常用函數(shù)

int available() 返回可以不受阻塞地從此輸入流中讀取的字節(jié)數(shù)。

void close() 關(guān)閉此管道輸入流并釋放與該流相關(guān)的所有系統(tǒng)資源。

void connect(PipedOutputStream src) 使此管道輸入流連接到管道輸出流 src。

int read() 讀取此管道輸入流中的下一個(gè)數(shù)據(jù)字節(jié)。

int read(byte[] b, int off, int len) 將最多 len 個(gè)數(shù)據(jù)字節(jié)從此管道輸入流讀入 byte 數(shù)組。

protected void receive(int b) 接收數(shù)據(jù)字節(jié)。

實(shí)例
package IO;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * Created by chenjiabing on 17-5-25.
 */

/**
 * 注意的問(wèn)題:
 * 1.寫線程正在往緩沖區(qū)寫數(shù)據(jù)的時(shí)候,但是此時(shí)的讀線程的管道結(jié)束,那么此時(shí)的寫線程的管道就會(huì)發(fā)生IOException異常
 * 2.讀線程正在從緩沖區(qū)讀數(shù)據(jù)的時(shí)候,但是此時(shí)的寫線程的管道已經(jīng)結(jié)束了,此時(shí)就會(huì)引起讀線程的管道發(fā)生IOException異常
 * 3.必須是啟用多線程才能實(shí)現(xiàn)管道之間的讀寫,否則會(huì)出現(xiàn)堵塞現(xiàn)象,因?yàn)檫@里的PipeOutputStream每次向緩沖區(qū)寫入的字節(jié)數(shù)最大是1024,如果不及時(shí)的減少緩沖區(qū)的數(shù)據(jù)量就會(huì)出現(xiàn)堵塞
 */

public class demo7 {
    public static PipedOutputStream outputStream = new PipedOutputStream();
    public static PipedInputStream inputStream = new PipedInputStream();

    /**
     * 創(chuàng)建一個(gè)寫入數(shù)據(jù)進(jìn)程,使用的是PipeOutStream,將數(shù)據(jù)寫入管道中
     */
    public static void send() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                byte[] bytes = new byte[2000];     //創(chuàng)建一個(gè)2000字節(jié)的數(shù)組
                while (true) {
                    try {
                        outputStream.write(bytes, 0, 2000);  //寫入管道,但是這里的緩沖區(qū)最多寫入1024個(gè)字節(jié)的數(shù)據(jù),因此這個(gè)是一次沒有寫完
                        System.out.println("寫入成功");
                    } catch (IOException e) {
                        System.out.println("寫入失敗");
                        System.exit(1);
                    }
                }
            }
        }).start();
    }

    /**
     * 使用PipeInputStream創(chuàng)建一個(gè)讀取的線程
     */

    public static void receive() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                byte[] bytes = new byte[100];  //一次性只讀取100個(gè)字節(jié)
                int len = 0;
                try {
                    len = inputStream.read(bytes, 0, 100);  //讀取
                    while (len != -1) {
                        System.out.println("已經(jīng)讀取了" + len + "個(gè)字節(jié)");
                        len = inputStream.read(bytes, 0, 100);
                    }


                } catch (IOException e) {
                    System.out.println("讀取失敗");
                    System.exit(1);
                }

            }
        }).start();

    }

    public static void main(String args[]) {
        try {
            inputStream.connect(outputStream);  //連接
        } catch (IOException e) {
            System.out.println("連接失敗");
            System.exit(1);
        }
        send();
        receive();


    }

}

注意:從上面的運(yùn)行結(jié)果可以看出,緩沖區(qū)最多可以寫入1024個(gè)字節(jié)的數(shù)據(jù),所以在緩沖區(qū)滿了之后上面的send進(jìn)程就會(huì)堵塞等待緩沖區(qū)空閑,如果recieve進(jìn)程不繼續(xù)讀取數(shù)據(jù)了,那么就會(huì)一直出現(xiàn)堵塞

問(wèn)題

寫線程正在往緩沖區(qū)寫數(shù)據(jù)的時(shí)候,但是此時(shí)的讀線程的結(jié)束讀取,那么此時(shí)的寫線程的管道就會(huì)發(fā)生IOException異常,可以將上面receive進(jìn)程中的while(true)去掉就可以清楚的看出

讀線程正在從緩沖區(qū)讀數(shù)據(jù)的時(shí)候,但是此時(shí)的寫線程的管道已經(jīng)結(jié)束了,此時(shí)就會(huì)引起讀線程的管道發(fā)生IOException異常,將上面的send進(jìn)程中的while(true)去掉就可以實(shí)現(xiàn)這個(gè)問(wèn)題

必須是啟用多線程才能實(shí)現(xiàn)管道之間的讀寫,否則會(huì)出現(xiàn)堵塞現(xiàn)象,因?yàn)檫@里的PipeOutputStream每次向緩沖區(qū)寫入的字節(jié)數(shù)最大是1024,如果不及時(shí)的減少緩沖區(qū)的數(shù)據(jù)量就會(huì)出現(xiàn)堵塞

解決方法

后續(xù)更新中..........

參考文章

http://www.cnblogs.com/lich/archive/2011/12/11/2283928.html

http://ifeve.com/java-io-%E7%AE%A1%E9%81%93/

http://www.cnblogs.com/chinareny2k/archive/2010/03/24/1693878.html

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67120.html

相關(guān)文章

  • 我的阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評(píng)論0 收藏0
  • 好文章必讀 - 收藏集 - 掘金

    摘要:方法即為收集器,它接收高階函數(shù)和的后端掘金年的第一天,我坐在獨(dú)墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個(gè)新的,可以替代標(biāo)準(zhǔn)的。 設(shè)計(jì)模式之單例模式 - 掘金前言 作為一個(gè)好學(xué)習(xí)的程序開發(fā)者,應(yīng)該會(huì)去學(xué)習(xí)優(yōu)秀的開源框架,當(dāng)然學(xué)習(xí)的過(guò)程中不免會(huì)去閱讀源碼,這也是一個(gè)優(yōu)秀程序員的必備素養(yǎng),在學(xué)習(xí)的過(guò)程中很多人會(huì)遇到的障礙,那就是設(shè)計(jì)模式。很多優(yōu)秀的框架會(huì)運(yùn)...

    FrozenMap 評(píng)論0 收藏0
  • 關(guān)于Java IO與NIO知識(shí)都在這里

    摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來(lái)說(shuō)中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過(guò)的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來(lái)了,便于大家學(xué)習(xí)與回顧。 Ja...

    Riddler 評(píng)論0 收藏0
  • Android IPC機(jī)制()用Socket實(shí)現(xiàn)跨進(jìn)程聊天程序

    摘要:簡(jiǎn)介簡(jiǎn)介也稱作套接字,是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用以實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。它分為流式套接字和數(shù)據(jù)包套接字,分別對(duì)應(yīng)網(wǎng)絡(luò)傳輸控制層的和協(xié)議。1.Socket簡(jiǎn)介 Socket也稱作套接字,是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用以實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。它分為流式套接字和數(shù)據(jù)包套接字,...

    lufficc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<