繁体   English   中英

Java Socket关闭OutputStream

[英]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时,我应该关闭它们。 这只是一种方法,但是我还有其他多种方法,它们也使用OutputStreamObjectOutputStream将数据发送到我的客户端。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM