今天一个朋友和我说没必要关闭流,我说怎么可能,然后他对我说,那你写出一个不关闭流,并且运行会出问题的代码,但是我写不出来,这就导致我也开始觉得“不关闭流没什么问题”,所以想求一段不关闭流,在运行时会出现问题的代码,还有就是希望朋友们不要玩理论上的说辞,比如说不关闭流会占用内存之类的,这些东西我早就懂了,但是今天这个朋友就把我问住了,我真的写不出来这个代码,有人能帮写出来吗?
2条回答 默认 最新
- HHeyJ 2021-07-15 11:24关注
望采纳
public static void main(String[] args) { for (int i = 0; i < 1000000000; i++) { try { FileInputStream fis = null; fis = new FileInputStream("/Users/hfc/Documents/1"); // 内容是:abc StringBuilder sb = new StringBuilder(); int temp = 0; //当temp等于-1时,表示已经到了文件结尾,停止读取 while ((temp = fis.read()) != -1) { sb.append((char) temp); } System.out.println(sb); } catch (Exception e) { log.error("异常:",e); } } }
不同的流有不同的物理实现,close() 的物理作用也有所不同,所以忘记了 close() 的后果也不一样。
比如 ByteArrayInputStream 这种输入流,close() 与否就没什么关系。如果输入流是一个网络连接。如果忘记 close() 的话,它会一直占用着网络连接,直到 timeout 后系统自动关闭这个网络连接。也就是说,如果你忘记了关闭这个资源,到了一定的时候,系统会替你关闭。但如果类似这样的程序被执行很多次,就会有大量资源被长时间无效占用,极端情况下可能导致后续程序资源不足而失败。
再比如 FileInputStream,你要是忘记关闭了,它就一直占用着,直到 JVM 退出最后导致文件流打开过多报错java.io.FileNotFoundException: /Users/hfc/Documents/1 (Too many open files) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(FileInputStream.java:195) at java.io.FileInputStream.<init>(FileInputStream.java:138) at java.io.FileInputStream.<init>(FileInputStream.java:93) at com.qmgyl.wm.service.XXXX.main(XXXX.java:33)
好的编程习惯是:主动用程序严格控制对资源的释放,而不必区分其具体的物理实现,不要指望系统级的回收机制。这样能保证程序的可读性和可靠性。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 iqoo11 如何下载安装工程模式
- ¥15 本题的答案是不是有问题
- ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
- ¥15 C++使用Gunplot
- ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
- ¥15 matlab数字图像处理频率域滤波
- ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
- ¥15 ELGamal和paillier计算效率谁快?
- ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
- ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?