2010-11-05 81 views
4

我使用下面的代碼從一個服務器的連接關閉一個InputStream和一個OutputStream:InputStream和OutputStream應該如何關閉?

try { 
     if (mInputStream != null) { 
      mInputStream.close(); 
      mInputStream = null; 
     } 

     if (mOutputStream != null) { 
      mOutputStream.close(); 
      mOutputStream = null; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

然而,流不關閉,他們還活着。如果我再次連接有兩個不同的InputStream。 catch部分沒有發現任何異常情況。

我在做什麼錯?

+4

不管事實是一個異常沒有被拋出,你應該把接近語句finally塊,這樣你流將始終正確關閉(例外或不)。 – McStretch 2010-11-05 17:12:04

+0

「溪流還活着」是什麼意思? – 2010-11-05 17:15:46

+0

在調用close方法之後,流仍然從服務器接收數據。當我關閉應用程序時,連接關閉。 ^^ ;;; – mooongcle 2010-11-05 17:19:45

回答

15

兩個問題,你的發佈代碼:

  1. ()調用應該在處理finally塊的.close。這樣他們總是會被關閉,即使它在某個方向上掉進了一個捕獲塊。
  2. 您需要在自己的try/catch塊中處理每個.close()調用,或者可以讓其中一個擱置。如果您嘗試關閉輸入流失敗,您將跳過關閉輸出流的嘗試。

你想要更多的東西是這樣的:

InputStream mInputStream = null; 
    OutputStream mOutputStream = null; 
    try { 
     mInputStream = new FileInputStream("\\Path\\MyFileName1.txt"); 
     mOutputStream = new FileOutputStream("\\Path\\MyFileName2.txt"); 
     //... do stuff to your streams 
    } 
    catch(FileNotFoundException fnex) { 
     //Handle the error... but the streams are still open! 
    } 
    finally { 
     //close input 
     if (mInputStream != null) { 
      try { 
       mInputStream.close(); 
      } 
      catch(IOException ioex) { 
       //Very bad things just happened... handle it 
      } 
     } 
     //Close output 
     if (mOutputStream != null) { 
      try { 
       mOutputStream.close(); 
      } 
      catch(IOException ioex) { 
       //Very bad things just happened... handle it 
      } 
     } 
    } 
相關問題