軟件是對質量的不懈追求

          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)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 汉寿县| 陆丰市| 赫章县| 乌审旗| 沧州市| 平遥县| 三台县| 哈密市| 湄潭县| 白水县| 凉城县| 奉化市| 阿克陶县| 大安市| 黄山市| 泗水县| 广汉市| 老河口市| 永年县| 沙雅县| 新营市| 壤塘县| 金川县| 临颍县| 亳州市| 南宫市| 雷波县| 呼伦贝尔市| 团风县| 山西省| 和田县| 桐柏县| 庄浪县| 闻喜县| 新化县| 南郑县| 游戏| 迁安市| 遂川县| 息烽县| 南木林县|