IT科技

當前位置 /首頁/IT科技 > /列表

outputstream轉inputstream

outputstream怎麼轉換成inputstream有三種方法。

方法一:使用字節數組緩存數據,輸入代碼:

ByteArrayOutputStream out = new ByteArrayOutputStream();

class1.putDataOnOutputStream(out);

class2.processDataFromInputStream(

new ByteArrayInputStream(out.toByteArray())

);

outputstream轉inputstream

方法二:使用管道

第一種方法的問題是你必須有足夠的內存緩存所有數據。你可以使用文件系統緩存更多數據,但無論如何可處理數據的大小還是受到限制。

解決方法是創建一個線程產生數據到PipedOutputStream。當前線程可從中讀取數據。

輸入代碼:

PipedInputStream in = new PipedInputStream();

PipedOUtputStream out = new PipedOutputStream(in);

new Thread(

new Runnable(){

public void run(){

class1.putDataOnOutputStream(out);

}

}

).start();

class2.processDataFromInputStream(in);|||

outputstream轉inputstream 第2張

方法三:使用循環緩存區

方法二中的兩個管道流,實際上管理着一個隱藏的循環緩存區。使用一個顯式的循環緩存區更易於理解。CircularBuffers 有如下優點

一個CircularBuffers類而不是兩個管道類。

較於緩存所有數據和額外線程的方法更容易使用。

你可以更改緩存大小而不必受限於管道緩存區1K的固定緩存大小。

多線程情形:

CircularByteBuffer cbb = new CircularByteBuffer();

new Thread(

new Runnable(){

public void run(){

class1.putDataOnOutputStream(cbb.getOutputStream());

}

}

).start();

class2.processDataFromInputStream(cbb.getInputStream());

單線程情形

// buffer all data in a circular buffer of infinite size

CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE);

class1.putDataOnOutputStream(cbb.getOutputStream());

class2.processDataFromInputStream(cbb.getInputStream());

TAG標籤:outputstream inputstream #