軟件是對質量的不懈追求

          java中如何將OutputStream轉換為InputStream(翻譯)

          原文地址:http://ostermiller.org/convert_java_outputstream_inputstream.html

           如果你曾經使用java IO編程,你會很快碰到這種情況,某個類在OutputStream上創建數據而你需要將它發送給某個需要從輸入流讀取數據的類。
          你很快會被問道,“java中如何將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);

          方法三:使用循環緩存區
            方法二中的兩個管道流,實際上管理著一個隱藏的循環緩存區。使用一個顯式的循環緩存區更易于理解。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());


          posted on 2009-05-17 21:40 BlakeSu 閱讀(1104) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 沅陵县| 高唐县| 交城县| 大关县| 宁阳县| 铜陵市| 黄骅市| 威信县| 报价| 永川市| 沙雅县| 田林县| 洪洞县| 呼和浩特市| 肇东市| 惠东县| 和平区| 育儿| 互助| 册亨县| 平乐县| 泽库县| 榆林市| 尼玛县| 香格里拉县| 磐安县| 沁水县| 澄江县| 炉霍县| 新干县| 巴楚县| 龙海市| 南投市| 如东县| 安多县| 泰来县| 石门县| 皮山县| 陵水| 高碑店市| 东宁县|