java - InputStreams 被 GCed

标签 java garbage-collection fileoutputstream

我知道如果我做类似的事情

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 流方法很可能在内部使用它自己的缓冲区,因此包装输出应该是不必要的。

FileInputStreamFileOutputStream 声明变量,并在 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/

相关文章:

java - 使用 Guice 将字符串注入(inject)类进行 JUnit 测试

java - 比较 Java 7 中的 Object 和 int

java - 尝试使用将对象转换为字节数组时频繁GC

java - 使用 ThinkFree PDF Viewer 显示原始 PDF 数据的 Base64 编码字符串

java - ObjectOutputStream 的 writeObject 方法使用什么字符编码?

java - viewpager 完成后调用 Activity

javascript - JS String 连接爆炸内存消耗

java - Java中循环对象的垃圾收集

java - OutputStream 不会保存文件的所有更新

java - 通过 JDBC 使用 Derby DB 检索列 Default