Java 是否需要调用ObjectOutputStream#close()?

Java 是否需要调用ObjectOutputStream#close()?,java,io,heap-memory,java-6,objectoutputstream,Java,Io,Heap Memory,Java 6,Objectoutputstream,我正在使用Java1.6。 我面临一些内存堆问题,在堆转储中,我可以看到对象正在消耗更多内存 在某些地方的应用程序中,我使用了ObjectOutputStream,但在某些方法中没有关闭流。 那么这会影响性能吗?? 流是否会保持打开状态并消耗堆内存 当使用ObjectOutputStream但流未关闭时,Java是否会在方法完成时关闭流?否,Java不会自行关闭流。 将其打开会对性能造成多大的影响取决于代码的其余部分。如果经常使用这种方法,这将是一个严重的问题。不管怎样,关闭流只是更好的练习方式

我正在使用Java1.6。 我面临一些内存堆问题,在堆转储中,我可以看到对象正在消耗更多内存

在某些地方的应用程序中,我使用了
ObjectOutputStream
,但在某些方法中没有关闭流。 那么这会影响性能吗?? 流是否会保持打开状态并消耗堆内存


当使用
ObjectOutputStream
但流未关闭时,Java是否会在方法完成时关闭流?

否,Java不会自行关闭流。 将其打开会对性能造成多大的影响取决于代码的其余部分。如果经常使用这种方法,这将是一个严重的问题。不管怎样,关闭流只是更好的练习方式

这是升级到java 7的一个很好的理由,您可以在java 7中编写

try (ObjectOutputStream stream = ...) {
    ...
}
在这里,java将在您使用完流后为您关闭流,无论这种情况如何发生


当然,您可以在Java6中实现相同的行为,但它是。

不,java不会自己关闭流。 将其打开会对性能造成多大的影响取决于代码的其余部分。如果经常使用这种方法,这将是一个严重的问题。不管怎样,关闭流只是更好的练习方式

这是升级到java 7的一个很好的理由,您可以在java 7中编写

try (ObjectOutputStream stream = ...) {
    ...
}
在这里,java将在您使用完流后为您关闭流,无论这种情况如何发生


当然,您可以在java 6中实现相同的行为,但在java 1.6中,它是。

,请看:

接近

公众假期结束() 抛出IOException关闭流。必须调用此方法才能释放与流关联的任何资源

must
非常强大,所以我想说是的,你必须调用它

我们可以看一下:

它确实能清理一些东西。它还实现了接口,该接口:

可自动关闭的公共接口

不再需要时必须关闭的资源

因此,调用
close()
方法


注意:即使
close()
什么也没做,我还是会调用它,以便在代码中明确表示不再使用它,但这可能是个人的偏好。

在Java 1.6中,查看:

接近

公众假期结束() 抛出IOException关闭流。必须调用此方法才能释放与流关联的任何资源

must
非常强大,所以我想说是的,你必须调用它

我们可以看一下:

它确实能清理一些东西。它还实现了接口,该接口:

可自动关闭的公共接口

不再需要时必须关闭的资源

因此,调用
close()
方法

注意:即使
close()
什么也没做,我还是会打电话给它,在代码中明确表示不再使用它,但这可能是个人偏好。

添加一些注释:

从另一个角度来看,您可能会问自己:在某些情况下保持
ObjectOutputStream
打开的原因是什么?如果你不再使用它,那么你肯定应该尽快关闭它。遵循这个惯例是个好主意

close
方法确保没有对流的引用,因此可以对资源进行垃圾收集;为了拥有一个健康的记忆空间,使用它绝对是你想要做的事情

我通常做的是在没有catch{}的情况下进行
try{}finally{}

public static void closeStream(OutputStream out)
{
    if (out != null) out.close();
}

...

ObjectOutputStream out = null;

try
{
    //do something
}
finally
{
    closeStream(out);
}
当然,如果需要,您可以使用
catch
块,或者将
throws
添加到方法中。无论哪种方式,都可以确保流资源已释放。

添加一些注释到:

从另一个角度来看,您可能会问自己:在某些情况下保持
ObjectOutputStream
打开的原因是什么?如果你不再使用它,那么你肯定应该尽快关闭它。遵循这个惯例是个好主意

close
方法确保没有对流的引用,因此可以对资源进行垃圾收集;为了拥有一个健康的记忆空间,使用它绝对是你想要做的事情

我通常做的是在没有catch{}的情况下进行
try{}finally{}

public static void closeStream(OutputStream out)
{
    if (out != null) out.close();
}

...

ObjectOutputStream out = null;

try
{
    //do something
}
finally
{
    closeStream(out);
}

当然,如果需要,您可以使用
catch
块,或者将
throws
添加到方法中。无论哪种方式,您都可以确保流资源已被释放。

我相信您误读了这个问题。它讨论的是
ObjectOutputStream
,而不是您上面提到的
OutputStream
。您可能需要重新考虑您的答案。@SteveC您是对的,谢谢您向我指出这一点。我相信您误读了这个问题。它讨论的是
ObjectOutputStream
,而不是您上面提到的
OutputStream
。您可能需要重新考虑您的答案。@SteveC您是对的,谢谢您向我指出这一点。是的,我看到Java 1.7将自动关闭流。但目前java 1.6支持该应用程序。所以升级到Java7不是一个选项。是的,我看到Java1.7将自动关闭流。但目前java 1.6支持该应用程序。所以升级到Java7不是一个选项。这些答案对你有帮助吗?如果是的话,你应该考虑接受一个!对我已经更改了代码,并遵循传统方法,即使用完成后关闭流。答案对您有帮助吗?如果是的话,你应该考虑接受一个!