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