2013-04-05 75 views
2

我是Java和HttpURLConnection的新手。我應該在斷開連接之前關閉打開的IO流。如果我關閉了這些流,我是否還需要刪除連接?哪一種是正確的實施方式?HttpURLConnection關閉IO流

try { 
String uri = "http://localhost:8081/RESTEASY/saju/post/text"; 
URL url = new URL(uri); 
connection = 
    (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Accept", "text/plain"); 
connection.setRequestProperty("Content-Type", "text/plain"); 
connection.setDoOutput(true); 

OutputStream os = connection.getOutputStream(); 

//bla bla 

System.out.println(connection.getResponseCode()); 
InputStream iStream = connection.getInputStream(); 

//bla bla 

} catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
}finally{ 
    // os.close(); - IS THIS REQUIRED 
    // iStream.close(); - IS THIS REQUIRED 
    connection.disconnect();  
} 
} 

回答

7

當您完成使用它們時,您應該在輸入/輸出/錯誤流上調用close()

斷開更復雜。根據javadoc爲disconnect()

「表示在不久的將來,其他請求到服務器的可能性不大。」

這意識到HTTP 1.1規範具有「持續連接」功能,該功能允許在對同一服務器的一系列請求中使用相同的TCP/IP連接。 (這種情況透明。)當您致電disconnect時,可能會將其視爲關閉連接的提示。

從資源和性能的角度來看

所以:

  • 這是好主意,打電話disconnect如果你是不太可能發送另一個請求到同一臺服務器,
  • 是如果另一個壞主意很可能在不久的將來提出要求。
+0

您確定您的聲明對於關閉流是正確的嗎?我遇到了困難(可能是我堅持使用的JDK 1.6是bug)。但從某種意義上來說,如果在讀取輸入流之前關閉輸出流,那麼它會關閉套接字,並且無法讀取輸入。如果你關閉輸入流然後試圖關閉輸出流,那麼你也會得到一個異常,導致套接字關閉。 我想要一個響應處理程序來處理輸入流本身,但它似乎正確的順序是寫入輸出,讀取輸入,關閉輸出,關閉輸入? – fd8s0 2013-08-28 16:25:36

+1

我不確定我說的話有多大意義,我最終解決了我的問題,但是對於高頻率請求,順序非常重要,特別是您需要確保您讀取整個輸入/錯誤流......這種輸入和錯誤流的分離是荒謬的,我不知道誰是涉及到的天才 – fd8s0 2013-08-28 17:33:11