2013-04-05 585 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