作为学校的练习,我用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对象呢?
由于变量是函数的本地变量,因此一旦函数存在,它将超出范围,最终成为垃圾回收机制。对您的问题的回答是否定的,在您的情况下,文件对象永远不会打开。
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();
}
}
文件对象只是路径名的抽象表示,它与打开文件无关。因此无法关闭。
问题内容: 我试图从控制台开始调试我的应用程序。 然后在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能够正常查找到这个文件,就会返回一个代表文件的文