java中如何將OutputStream轉換為InputStream


在不需要文件生成的情況下,直接將輸出流轉換成輸入流。可使用下面的三種方法:

如果你曾經使用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());

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM