当前位置: 首页 > 知识库问答 >
问题:

这个文件对象打开了吗?

权胜泫
2023-03-14

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

共有3个答案

邵奇
2023-03-14

由于变量是函数的本地变量,因此一旦函数存在,它将超出范围,最终成为垃圾回收机制。对您的问题的回答是否定的,在您的情况下,文件对象永远不会打开。

秋光熙
2023-03-14

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

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

为了使类有资格自动关闭try资源块中的资源,该类必须实现java。lang.AutoCloseable(或java.io.Closeable)<代码>扫描仪不实现这些接口,因此当您退出try资源块时,它不会调用其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();
    }
}
燕靖
2023-03-14

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

 类似资料:
  • 问题内容: 我试图从控制台开始调试我的应用程序。 然后在gdb中 我得到的输出: 系统配置如下: 问题答案: 您可以在gdb中使用该命令来更改gdb用于启动要调试的程序的环境。从gdb帮助中提取: 范例:

  • 问题内容: 我有一个二进制文件和一个共享库。共享库使用以下命令进行编译: 二进制文件使用以下命令进行编译: 我进去了 到输出路径。 从控制台调试工作正常: 但是,从Emacs22启动gdb失败,并显示以下消息: 启动程序:/ mnt / sda5 / Programming / main / src / mainx / mnt / sda5 / Programming / main / src /

  • 问题内容: 我正在尝试使用Ubuntu 10.04服务器,sphinx,myql2版本0.2.7和percona服务器5.5(Myslql 5.5)运行Rails两个应用程序。irb中的mysql2可以正常工作,我可以连接到数据库。这个rails 2应用程序正在另一个带有MySql 5.1的Centos服务器中工作。当我跑步时: 我得到: mysql2.so:libmysqlclient_r.so

  • 我跟随这篇关于人工智能农业的文章与谷歌合作 https://medium.com/deepquestai/ai-in-agriculture-detecting-defects-in-apples-b246799b329c 当运行python文件时,它会给出一个错误 ImportError:libcublas.so.10.0:无法打开共享对象文件:运行时没有此类文件或目录 使用TensorFlow

  • 在RHEL 6中,我通过remi存储库安装了PHP7.2: 检查了使用预安装的模块。它没有列出。因此,我继续安装它: 再次检查模块,发现oci8尚未加载。为了测试我用尝试的所有模块是否都失败(默认情况下未安装): 如果我做mbstring成功地列在那里。我错过了什么与?提前谢谢你。 我已经将扩展添加到php中。扩展名为oci8的ini文件。然后我做了: PHP警告:PHP启动:无法加载第0行中未知

  • 打开文件 有了上述分析后,我们可以看看如果一个用户进程打开文件会做哪些事情?首先假定用户进程需要打开的文件已经存在在硬盘上。以user/sfs_filetest1.c为例,首先用户进程会调用在main函数中的如下语句: int fd1 = safe_open("sfs\_filetest1", O_RDONLY); 从字面上可以看出,如果ucore能够正常查找到这个文件,就会返回一个代表文件的文