此文件对象是否保持打开状态?

时间:2013-05-06 01:21:22

标签: java file try-with-resources

作为学校的练习,我在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);                                       
        }                                                                      
    }

这就是我需要它,但我有一个问题。 文件对象是否曾打开过?如果是的话,它是否会关闭?我在Scanner对象上使用了try-with-resources,所以我很确定我不必明确关闭它,但是文件对象怎么样?

3 个答案:

答案 0 :(得分:3)

File对象只是路径名的抽象表示,它与打开文件无关。所以它无法关闭。

答案 1 :(得分:1)

File对象无法打开(因此无法关闭),因为它是文件路径的表示,而不是文件的表示。

Scanner类打开您的文件以便阅读它。您的程序不会调用in.close()所以当您的方法返回时,Scanner将不会被垃圾收集,因为它仍然具有对打开文件的引用。您也可能会锁定文件,具体取决于Scanner打开文件的方式。

为了使类有资格自动关闭try-resource块中的资源,该类必须实现java.lang.AutoCloseable(或java.io.Closeable)。 Scanner未实现这些接口,因此在退出try-resource块时不会调用其close()方法。

将代码更改为:

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();
    }
}

答案 2 :(得分:0)

由于变量是函数的本地变量,因此一旦函数存在,它将超出范围,并最终进行垃圾收集。回答你的问题是NO,在你的情况下,文件对象永远不会被打开。