【问题标题】:closing the streams of I/o关闭 I/O 流
【发布时间】:2011-03-01 13:23:33
【问题描述】:

如果我不关闭流,可能会发生什么不好的事情?

关闭操作会自动刷新吗?

程序退出后所有的流都关闭了吗?

提前致谢。

【问题讨论】:

标签: java stream io


【解决方案1】:

不关闭流时可能发生的坏事:

  • 您可能会用完文件句柄
  • 您认为已写入磁盘的数据可能仍在缓冲区中(仅)
  • 文件可能仍被其他进程锁定(取决于平台)
  • ...

是的,关闭操作总是刷新流。

操作系统知道的所有文件句柄都已关闭。这实际上意味着FileOutputStreamFileInputStreamSocket 的输入/输出将被关闭。但是,如果您将FileOutputStream 包装在BufferedOutputStream 中,那么操作系统将知道BufferedOutputStream,并且不会在关机时关闭/刷新。因此,写入BufferedOutputStream 但尚未刷新到FileOutputStream 的数据可能会丢失。

【讨论】:

  • 所以当程序退出时所有流都会自动关闭..close操作会自动刷新..所以我很安全,不是吗
  • 其实:我没有完全正确。我编辑了我的答案。
  • 为什么只有操作系统知道 FileInputStream 和 OutputStream ..为什么不知道 BufferedOutputStream
  • @saravanan: File*Stream 代表直接的操作系统资源(即打开的文件句柄)。 BufferedOutputStream 是包装另一个输出流的纯 Java 对象。操作系统不需要知道它的存在。
  • 如果流超出范围会发生什么? GC 是否可以重新收集所有资源,包括文件句柄?
【解决方案2】:

1) 您不必要地占用了系统资源(例如文件描述符)。可能已经用完了。

2) 是的(尽管您应该检查您感兴趣的特定流的文档以确定)。

3) 是的

【讨论】:

  • 在我之前工作的项目中,没有关闭文件描述符,运行几天后出现了数千个异常:D
【解决方案3】:

为了符合条件,当您执行 close() 时,它会刷新数据并关闭文件句柄。如果退出,文件句柄将关闭,但未刷新的数据会丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2011-10-25
    • 1970-01-01
    • 2021-11-25
    • 2023-03-08
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多