outputstream轉inputstream
outputstream怎麼轉換成inputstream有三種方法。
方法一:使用字節數組緩存數據,輸入代碼:
ByteArrayOutputStream out = new ByteArrayOutputStream();
class1.putDataOnOutputStream(out);
class2.processDataFromInputStream(
new ByteArrayInputStream(out.toByteArray())
);
方法二:使用管道
第一種方法的問題是你必須有足夠的內存緩存所有數據。你可以使用文件系統緩存更多數據,但無論如何可處理數據的大小還是受到限制。
解決方法是創建一個線程產生數據到PipedOutputStream。當前線程可從中讀取數據。
輸入代碼:
PipedInputStream in = new PipedInputStream();
PipedOUtputStream out = new PipedOutputStream(in);
new Thread(
new Runnable(){
public void run(){
class1.putDataOnOutputStream(out);
}
}
).start();
class2.processDataFromInputStream(in);|||
方法三:使用循環緩存區
方法二中的兩個管道流,實際上管理着一個隱藏的循環緩存區。使用一個顯式的循環緩存區更易於理解。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());