Java 关闭I/o流

Java 关闭I/o流,java,stream,io,Java,Stream,Io,如果我不关闭流,会发生什么坏事 关闭操作是否自动刷新 程序退出后是否关闭所有流 提前感谢。1)您不必要地占用了系统资源(例如文件描述符)。可能已经用完了 2) 是(尽管您应该检查您感兴趣的特定流的文档以确定) 3) 是如果不关闭流,可能会发生不好的事情: 您可能会用完文件句柄 您认为已写入磁盘的数据可能仍在缓冲区中(仅限) 其他进程可能仍锁定文件(取决于平台) 是的,关闭操作总是刷新流 操作系统知道的所有文件句柄都已关闭。这意味着FileOutputStream,FileInputStre

如果我不关闭流,会发生什么坏事

关闭操作是否自动刷新

程序退出后是否关闭所有流

提前感谢。

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

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


3) 是

如果不关闭流,可能会发生不好的事情:

  • 您可能会用完文件句柄
  • 您认为已写入磁盘的数据可能仍在缓冲区中(仅限)
  • 其他进程可能仍锁定文件(取决于平台)
是的,关闭操作总是刷新流


操作系统知道的所有文件句柄都已关闭。这意味着
FileOutputStream
FileInputStream
套接字的输入/输出将被关闭。但是,如果将
文件输出流
包装在
缓冲输出流
中,则操作系统将不知道该
缓冲输出流
,并且不会在关机时关闭/刷新。因此,写入到
缓冲输出流
但尚未刷新到
文件输出流
的数据可能会丢失。

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

请参阅本文,其中有类似的问题,并给出了一些很好的答案。在我之前工作的项目中,我没有关闭文件描述符,在运行了几天之后,出现了数千个异常:DSO程序退出时所有流都自动关闭关闭操作自动刷新。所以我是安全的,但实际上不是:我不是完全正确的。我编辑了我的答案。为什么FileInputStream和OutputStream只有os知道。为什么不知道BufferedOutputStream@saravanan:
File*Stream
表示直接操作系统资源(即打开的文件句柄)。
BufferedOutputStream
是包装另一个输出流的纯Java对象。操作系统不需要知道它的存在。如果流超出范围会发生什么?GC是否可以重新收集所有资源,包括文件句柄?