軟件是對質量的不懈追求

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

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

           如果你曾經使用java IO編程,你會很快碰到這種情況,某個類在OutputStream上創(chuàng)建數(shù)據(jù)而你需要將它發(fā)送給某個需要從輸入流讀取數(shù)據(jù)的類。
          你很快會被問道,“java中如何將OutputStream轉換為InputStream?”

           方法一:使用字節(jié)數(shù)組緩存數(shù)據(jù)
            最簡單的方法是用字節(jié)數(shù)組緩存數(shù)據(jù)。代碼如下:
               ByteArrayOutputStream out = new ByteArrayOutputStream();
               class1.putDataOnOutputStream(out);
               class2.processDataFromInputStream(
                  new ByteArrayInputStream(out.toByteArray())
               );
            于是,OutputStream就被轉換為InputStream了。

          方法二:使用管道
            第一種方法的問題是你必須有足夠的內存緩存所有數(shù)據(jù)。你可以使用文件系統(tǒng)緩存更多數(shù)據(jù),但無論如何可處理數(shù)據(jù)的大小還是受到限制。
          解決方法是創(chuàng)建一個線程產生數(shù)據(jù)到PipedOutputStream。當前線程可從中讀取數(shù)據(jù)。
            PipedInputStream in = new PipedInputStream();
            PipedOUtputStream out = new PipedOutputStream(in);
            new Thread(
              new Runnable(){
                public void run(){
                  class1.putDataOnOutputStream(out);
                }
              }
            ).start();
            class2.processDataFromInputStream(in);

          方法三:使用循環(huán)緩存區(qū)
            方法二中的兩個管道流,實際上管理著一個隱藏的循環(huán)緩存區(qū)。使用一個顯式的循環(huán)緩存區(qū)更易于理解。CircularBuffers 有如下優(yōu)點:
               一個CircularBuffers類而不是兩個管道類。
              較于緩存所有數(shù)據(jù)和額外線程的方法更容易使用。
              你可以更改緩存大小而不必受限于管道緩存區(qū)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 閱讀(1099) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 万山特区| 九龙城区| 辽宁省| 东辽县| 洛扎县| 安塞县| 大田县| 抚宁县| 阿拉善右旗| 友谊县| 南丰县| 泗洪县| 正镶白旗| 永嘉县| 台安县| 墨江| 石泉县| 浠水县| 舒城县| 中西区| 苗栗县| 河池市| 南汇区| 临泽县| 邹城市| 桐庐县| 罗江县| 浑源县| 寻乌县| 开远市| 梅河口市| 丹棱县| 丰台区| 荣昌县| 红河县| 洱源县| 敦煌市| 拜城县| 仁布县| 玛曲县| 泾阳县|