是开放此文件对象?(Is this file object left open?)

2019-10-29 14:52发布

作为一个练习的学校,我写在Java中的方法,搜索在文件中的字符。 下面是代码:

 public static void countLetter(char needle, String hayStack) throws IOException {

        File f = new File(hayStack);                                           
        try (Scanner in = new Scanner(f)) {                                    
            String str = null;                                                 
            while (in.hasNext()){                                              
                str += in.next();                                              
            }                                                                  
            char[] charArr = str.toCharArray();                                
            int counter = 0;                                                   
            for (char c: charArr) {                                            
                if (c == needle){                                              
                    counter++;                                                 
                }                                                              
            }                                                                  
            System.out.println(counter);                                       
        }                                                                      
    }

这做什么,我需要它,但我有一个问题。 在文件对象曾经打开? 如果是,那么它永远关闭? 我用的try-与资源的扫描对象,所以我敢肯定,我没有明确关闭,但对于文件对象?

Answer 1:

File对象是路径的只是一个抽象表示,它没有任何关系打开一个文件。 因此,它不能被关闭。



Answer 2:

File对象不能被打开(并且因此不能被关闭),因为它是一个文件路径的表示,而不是一个文件的表示。

Scanner类打开你的文件,以便阅读。 您的程序不调用in.close()所以当你的方法返回的Scanner将不会被垃圾回收,因为它仍然有一个打开的文件的引用。 您还可以根据文件是如何被打开的文件锁定Scanner

为了一类有资格在try-资源块的类必须实现自动关闭资源java.lang.AutoCloseable (或java.io.Closeable )。 Scanner没有实现这些接口,所以它不会有它close()当你退出的try-资源块调用的方法。

改变的代码:

public static void countLetter(char needle, String hayStack) throws IOException {

    File f = new File(hayStack);                                           
    try (Scanner in = new Scanner(f)) {                                    
        String str = null;                                                 
        while (in.hasNext()){                                              
            str += in.next();                                              
        }                                                                  
        char[] charArr = str.toCharArray();                                
        int counter = 0;                                                   
        for (char c: charArr) {                                            
            if (c == needle){                                              
                counter++;                                                 
            }                                                              
        }                                                                  
        System.out.println(counter);
        in.close();
    }
}


Answer 3:

由于变量是本地的功能,因此它会走出去的范围,一旦函数存在,并最终垃圾收集。 回答你的问题是NO,你的情况文件的对象是不是曾经打开。



文章来源: Is this file object left open?