文天大人 2021-07-15 10:23 采纳率: 75%
浏览 48
已结题

想求一段java不关闭流会出现运行异常的代码

今天一个朋友和我说没必要关闭流,我说怎么可能,然后他对我说,那你写出一个不关闭流,并且运行会出问题的代码,但是我写不出来,这就导致我也开始觉得“不关闭流没什么问题”,所以想求一段不关闭流,在运行时会出现问题的代码,还有就是希望朋友们不要玩理论上的说辞,比如说不关闭流会占用内存之类的,这些东西我早就懂了,但是今天这个朋友就把我问住了,我真的写不出来这个代码,有人能帮写出来吗?

  • 写回答

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)
    

    好的编程习惯是:主动用程序严格控制对资源的释放,而不必区分其具体的物理实现,不要指望系统级的回收机制。这样能保证程序的可读性和可靠性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 伱給的囘憶 2021-07-15 15:10
    关注

    还有这种问题的:操作完文件后,不关闭流,再删除文件会删不了

    public static void main(String[] args) throws Exception {
    
           File file= new File("D:\\cesi\\cesi.txt");
           //打印文件内容,不关闭流
           dy(file);
           //删除文件,不会报错,但文件还在并未被删除,如果把FileInputStream关闭了就能正常删除
           file.delete();
        }
        public static void dy(File file){
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
                byte[] b = new byte[(int)file.length()];
                while (fis.read(b) != -1) {
                }
                System.out.println(new String(b));
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月23日
  • 已采纳回答 7月15日
  • 创建了问题 7月15日

悬赏问题

  • ¥15 无法加载以下来源的扩展程序
  • ¥30 关于#oracle soa#的问题,请各位专家解答!
  • ¥15 mounriver里怎么对电机初始化是对pwm初始化函数和gpio初始化函数吗
  • ¥15 anaconda第一步就出不来了,文件名错误
  • ¥15 这个排列组合问题的思路哪个地方有错
  • ¥15 首页运行报错,首页运行报错
  • ¥15 jupyter里pandas为什么调用不了
  • ¥15 解决neuralprophet库运行报错
  • ¥20 想通过nas 配置一台iis服务器
  • ¥30 利用python编写元胞自动机教室火灾出逃,计算最佳出逃时间