Java Socket 关闭 OutputStream

标签 java sockets java-7

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

因此,如果我执行下面的代码,我就会明白 ObjectOutputStream 在 try block 之后关闭,并且套接字的 OutputStream 也被关闭,这最终 导致关闭我的套接字。

try(ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
   oos.writeObject(new MyDTO(data));
}

我当然可以将代码更改为如下所示,但每个人总是告诉我,当我使用完流后,应该关闭它们。这只是一个方法,但我还有多种其他方法也使用OutputStreamObjectOutputStream将数据发送到我的客户端.

try {
   ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())
   oos.writeObject(new MyDTO(data));
}

由于不关闭ObjectOutputStream,我是否需要预料到其他错误和不当行为?我认为,当您有突发流量应用程序时,关闭套接字很好,但当您执行流应用程序时,这有点奇怪。

最佳实践是什么?请教我。

最佳答案

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

try-with-resources 是为了更容易地编写保证释放其资源的代码,这在处理流、数据库连接和其他此类事物时通常很有用。您不必在任何地方都使用它,尤其是当它使您的工作更加困难时。

关于Java Socket 关闭 OutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36126325/

相关文章:

java - 安装 1.6 时使用 Java 1.4 for applet

java - Android:将 ArrayList 保存到 SharedPreferences,但加载它不起作用

java - 多人游戏(Java 套接字 java.io.StreamCorruptedException : invalid type code: 00)

python - linux环回接口(interface)到python中的特定接口(interface)

linux - 连接被peer重置,linux内核保持空闲连接多久

Java EE 安装程序在 Mac OS X Mavericks 上崩溃

java - 你可以在已经有java的共享主机上安装ant吗?

ssl - 如何使用 Java7 启用 TLSv1.1

java-7 - "Simplified Varargs Method Invocation"已经在当前的 OpenJDK 7 中实现了吗?

java - 为什么我必须导入 java.awt.* 和 java.awt.event.* (例如)