我知道如果我做类似的事情
copyFromInToOut(new FileInputStream(f1), new FileOutputStream(f2));
System.gc();
它将在那些 FileInputStream
上运行 GC,然后关闭它们。但如果我这样做了
copyFromInToOut(new BufferedInputStream(new FileInputStream(f1)), new BufferedOutputStream(new FileOutputStream(f2));
System.gc();
FileOutputStream 会在 BufferedOutputStream 之前被 GC 处理,而不导致缓冲区刷新,这是否存在任何危险? 我不能调用 flush, close,因为这需要比这更多的步骤。它首先涉及声明一个 bufferedinputstream,传递,然后调用关闭。或者我这样做安全吗?
最佳答案
不要显式调用 System.gc()
。不要依赖终结器来做任何事情。特别是如果您不了解垃圾收集的工作原理。可以忽略显式垃圾收集请求,终结器可能永远不会运行。
编写良好的 copyFromInToOut
流方法很可能在内部使用它自己的缓冲区,因此包装输出应该是不必要的。
为 FileInputStream
和 FileOutputStream
声明变量,并在 finally
block 中分别调用 close()
:
FileInputStream is = new FileInputStream(f1);
try {
FileOutputStream os = new FileOutputStream(f2);
try {
copyFromInToOut(is, os);
os.flush();
} finally {
os.close();
}
} finally {
is.close();
}
关于java - InputStreams 被 GCed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3928328/