Java Socket关闭OutputStream

时间:2016-03-21 08:43:04

标签: java sockets java-7

我在使用完毕后总是学会始终关闭一个流。 Java 7为您提供了一个新选项(即:try-with-resources),它一切都很好,除了当我关闭套接字的OutputStream时,套接字也会被关闭。这会适得其反,因为我在流媒体应用程序中使用套接字。

因此,如果我执行下面的代码,我理解ObjectOutputStream在try-block之后关闭,套接字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,我是否还需要其他错误和不当行为?当你有突发流量的应用程序时,我觉得套接字关闭很不错,但是当你做流媒体应用程序时它很奇怪。

最佳做法是什么?请教我。

2 个答案:

答案 0 :(得分:1)

显然,如果您仍然需要资源,则不会关闭它们。我们的想法是在完成之后关闭它们。如果您正在创建聊天软件,则会保持连接处于打开状态并使用正在使用的资源。但是,如果您要创建某种穷人的FTP软件,则可能需要在文件传输后关闭连接。

try-with-resources是为了更容易编写保证释放其资源的代码,这在处理流,数据库连接和其他此类事情时通常很有用。你没有 在任何地方使用它,特别是当它让你的工作更加努力时。

答案 1 :(得分:1)

这个问题确实没有意义。实际上,你不能在同一个套接字上创建多个ObjectOutputStreams(即使你知道怎么做也没有优势),所以没有理由在{{{{{ 1}}首先。它应该与套接字一起创建,几乎肯定存储为某个实例成员,并在您完成连接时关闭。