此文件对象是不是保持打开状态?
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++ 中的对象保持活动状态