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

Posted

技术标签:

【中文标题】此文件对象是不是保持打开状态?【英文标题】:Is this file object left open?此文件对象是否保持打开状态? 【发布时间】:2013-05-06 01:21:22 【问题描述】:

作为学校练习,我用 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,所以我很确定我不必显式关闭它,但是文件对象呢? p>

【问题讨论】:

【参考方案1】:

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

【讨论】:

相关问题***.com/questions/4752266/… 我认为你在这里有所收获。 据我所知,这就是它的归结。感谢您的观点 Mukesh。【参考方案2】:

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

【讨论】:

你在看哪个版本的“Scanner.java:348”,这是我的评论行。您可能指的是 cmets 中的一个部分,它说扫描仪将关闭 Closable,但您必须先调用 close,因为 Scanner 本身 not 可关闭。在 Scanner 中打开的文件不在范围内,因此在退出 try-resource 块时不会关闭。【参考方案3】:

由于变量是函数的本地变量,因此一旦函数存在,它就会超出范围,并最终进行垃圾回收。您的问题的答案是否定的,在您的情况下,文件对象从未打开过。

【讨论】:

我认为依靠突发事件来关闭文件并不好。我可能弄错了。 理想情况下你应该关闭它。

以上是关于此文件对象是不是保持打开状态?的主要内容,如果未能解决你的问题,请参考以下文章

读取整个文件是不是会使文件句柄保持打开状态?

打开“TestFlight Beta 测试”时,iTunes Connect 中的外部测试人员始终保持“非活动”状态...如何解决此问题?

JNI 通过多个 JNI 调用使 C++ 中的对象保持活动状态

一旦程序完成并在 1 次击键后关闭,是不是有办法让控制台窗口保持打开状态?

msbuild.exe 保持打开状态,锁定文件

如何在没有终端(保持打开状态)的情况下运行 .bat 文件?