Java中System.in/out/err是否始终打开?程序结束后是否关闭及实践疑问
关于Java中System.in/out/err的常见疑问解答
嘿,这个问题问到点子上了,我来给你一步步说清楚:
1. System.in/out/err是否始终处于打开状态?
JVM在启动程序的时候,就已经自动初始化并打开了这三个标准流,默认情况下它们分别关联到操作系统的标准输入(比如键盘)、标准输出(比如控制台)和标准错误输出设备。在程序正常运行期间,除非你显式调用close()方法手动关闭它们,否则它们会一直保持打开状态,随时可以被使用。
2. 程序结束后它们会被关闭吗?
答案是肯定的。不管程序是正常执行完毕(比如main方法运行结束),还是通过System.exit()主动终止,JVM在退出的时候都会自动负责关闭这三个标准流,释放它们占用的系统资源。当然,如果是通过强行杀死进程这种异常方式终止JVM,那可能来不及执行关闭操作,但这种属于极端情况,日常开发中基本不用考虑。
3. 这和“使用后关闭所有I/O流”的实践矛盾吗?
完全不矛盾!这里要区分两种不同的IO流:
- 我们自己创建的普通IO流(比如
FileInputStream、BufferedReader这些):这些是我们主动申请的系统资源,必须手动关闭或者用try-with-resources语法自动释放,否则会造成资源泄漏,影响程序性能甚至系统稳定性。 System.in/out/err这类JVM管理的标准流:它们是JVM启动时就绑定到系统设备的特殊资源,JVM会统一在退出时回收。而且程序运行过程中可能会多次用到它们(比如多次读取用户输入、打印日志),如果中途随意关闭,后续再调用就会抛出IO异常,反而影响程序正常运行。
简单说,“关闭所有IO流”的规则针对的是开发者自己创建的资源,标准流是JVM兜底处理的特殊情况,两者并不冲突。
内容的提问来源于stack exchange,提问作者mzoz
相关产品推荐
相关产品推荐

