作为学校的练习,我在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,所以我很确定我不必明确关闭它,但是文件对象怎么样?
答案 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,在你的情况下,文件对象永远不会被打开。