使用try with resources关闭Socket

4

我正在尝试编写一些简单的套接字代码,其基本形式如下 -

try(BufferedReader request = new BufferedReader(new InputStreamReader(sock.getInputStream()))){
//Do some work...
}
//BufferedReader gets closed, but also makes the socket close
...
...
response.write(blah);//Causes exception because socket is closed

我的问题是套接字被关闭了,但我认为它不应该被关闭。使用try-with-resources创建BufferedReader,并在离开try块时自动关闭它,但出于某种原因,它也关闭了整个套接字!因此,当我到达稍后使用相同套接字的响应代码时,会引发异常。有没有办法解决这个问题?还是我只能不使用try-with-resources(这将不理想)?

2个回答

6

BufferedReader.close()关闭了支撑流。

解决方法是使用“包装”流,它不会传播close()方法。


你知道有哪些流不会传播close()吗? - David says Reinstate Monica
2
Java运行时中没有“None”。你需要自己编写。 - Stephen Connolly
BufferedReader.close()关闭支持流,并关闭套接字的输入或输出流将同时关闭另一个流和套接字本身。 - user207421

1
代码:

new BufferedReader(
   new InputStreamReader(
      sock.getInputStream()))

将套接字流包装成一个读取器,再将其包装成BufferedReader,但这是唯一的流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接