【问题标题】:Java Socket closing OutputStreamJava Socket 关闭 OutputStream
【发布时间】:2016-03-21 08:43:03
【问题描述】:

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

所以如果我执行下面的代码,我知道ObjectOutputStream 在try-block 之后被关闭,并且套接字的OutputStream 也被关闭,这最终导致关闭我的套接字。

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,我是否必须预料到其他错误和不当行为?我认为当你有突发流量的应用程序时关闭套接字很好,但是当你做一个流应用程序时它有点奇怪。

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

【问题讨论】:

    标签: java sockets java-7


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。我的问题更多是关于如果我重用 OutputStream 并将其与多个 ObjectOutputStream 一起使用是否会出现任何问题。在我退出它们的范围(即 try-block)之后,ObjectOutputStreams 正确完成/对 Socket 没有影响?
    • 即使它确实有效,关闭尚未使用的流也不明智。这只是您不必要的工作。
    【解决方案2】:

    这个问题真的没有意义。实际上,您不能在同一个套接字上创建多个 ObjectOutputStreams(即使您知道如何做也没有优势),因此没有理由将 try-with-resources 与 ObjectOutputStream 一起使用第一名。它应该与套接字一起创建,几乎可以肯定地作为实例成员存储在某处,并在您完成连接时关闭。

    【讨论】:

    • 正如我所说,我总是学会关闭我的流。所以你会建议我与我的套接字一起创建一个 OutputStream 并将它作为我的控制器中的实例?因为现在我每次调用我的方法时都会创建一个输出/输入流。
    • 那你是死记硬背而不是应用智力。如果您应用了我在此处描述的为流使用实例成员的模式,那么您就不会 - 不可能 - 落入这个陷阱。我认为没有必要重复我的回答逐字,这就是你所要求的。
    • 是的,但是如果我有一个有很多连接的服务器,所有连接都存储在一个集合中。我必须映射 ObjectOutputStream 的另一个集合?这就是为什么我从未评估实例化 ObjectOutputStreams 的可能性,而是在调用方法时将即时实例化作为局部变量。
    • 当然我可以把所有东西都放在一个班级里,但我认为这样会更容易。
    • 当它不起作用时并不容易。您必须找到一种方法在套接字的整个生命周期中使用相同的流。
    猜你喜欢
    • 2011-01-13
    • 2021-06-12
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多