[英]Java Socket closing OutputStream
我总是学会在使用完流后始终关闭流。 Java 7为您提供了一个执行此操作的新选项(即:try-with-resources),一切都很好,只不过当我关闭套接字的OutputStream
时,套接字也会被关闭。 这适得其反,因为我在流应用程序中使用套接字。
因此,如果我执行下面的代码,我理解在try-block之后ObjectOutputStream
被关闭,套接字的OutputStream
被关闭, 最终导致关闭了我的Socket。
try(ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
oos.writeObject(new MyDTO(data));
}
我当然可以将代码更改为如下所示,但是每个人都一直告诉我,当我结束使用Streams时,我应该关闭它们。 这只是一种方法,但是我还有其他多种方法,它们也使用OutputStream
和ObjectOutputStream
将数据发送到我的客户端。
try {
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())
oos.writeObject(new MyDTO(data));
}
是否由于未关闭ObjectOutputStream
而导致其他错误和不当行为吗? 我认为当您有大量流量的应用程序时,关闭套接字是一件很不错的事情,但是当您在处理流应用程序时,这有点奇怪。
最佳做法是什么? 请教我。
显然,如果您仍然需要这些资源,则不会关闭它们。 想法是在完成使用后将其关闭。 如果要创建聊天软件,则应保持连接打开并使用资源。 但是,如果要创建某种穷人的FTP软件,则可能要在文件传输后关闭连接。
try-with-resources
是为了使编写保证释放其资源的代码更容易,这在处理流,数据库连接和其他此类事物时通常很有用。 您不必在任何地方都使用它,特别是当它使您的工作变得更加困难时。
这个问题真的没有道理。 实际上,您不能在同一个套接字上创建多个ObjectOutputStreams
(即使您知道如何做也没有优势),因此首先没有理由在ObjectOutputStream
上使用try-with-resources。 它应该与套接字一起创建,几乎可以肯定地作为实例成员存储在某个地方,并在完成连接后关闭。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.