使用File或FileReader与Scanner一起使用?

15

声明:我已经查看了所有可以找到的问题,但没有一个能回答这个确切的问题。如果您找到了,请指出并礼貌地告诉我。

那么,Oracle I/O 教程使用 Scanner 打开文本文件,如下所示:

new Scanner(BufferedReader(FileReader("xanadu.txt")));

但是Javadoc文档使用Scanner打开文本文件的方式如下:

new Scanner(new File("myNumbers"));

使用更简单的方法会很好,特别是当我有一个小文件并且可以使用较小的缓冲区时,但我也看到有人说,当你直接打开一个文件时,不能关闭它。如果是这种情况,为什么在官方文档中还要使用这个惯用语呢?

编辑:我还看到过new Scanner(FileReader("blah.txt"));,但这似乎是两全其美的最糟糕的选择。

编辑:我不想引发关于是否使用Scanner的争论。我有一个关于如何使用Scanner的问题。谢谢。

5个回答

6
你可以查看Scanner的实现(JDK随附有源代码)。Scanner类中也有 close() 方法。从本质上讲,对于读取小文件的用例,你列出的两种方法都是相同的 - 只是不要忘记在最后调用 close()。

1
正如@Tudor所指出的那样,File不会close() - 因此当您以这种方式使用Scanner时,实际文件是否关闭,还是资源被悬挂? - orbfish
3
是的,如果你将 File 传递给 Scanner 构造函数,它将用于打开流,该流在调用 Scanner.close() 方法后将被关闭。无论你使用哪种构造函数,只要正确地调用 close() 方法(例如在 try/finally 中),就会被正确关闭。 - maximdim

3

File类没有close()方法,因为它只是抽象了一个磁盘文件。它不是文件的输入流,所以没有需要关闭的内容。


是的,我知道File不是Closeable的。那么,你是让资源悬而未决(如问题中的链接所建议的)还是不这样做? - orbfish
2
你不会留下任何东西。File类只是一个物理文件的信息持有者,而不是文件句柄。 - Tudor

1
马适其所,从Scanner javadocs来看,Scanner是“一个可以使用正则表达式解析基本类型和字符串的简单文本扫描器。”因此,我的理解是:无论您使用哪种方法,使用File的简单选项与Oracle教程中找到的选项一样好。Scanner适用于方便地对文本文件进行标记化处理,如果您的文件很小,就像您所说的那样,它非常适合。
由于Scanner使用正则表达式,您不能真正期望它具有巨大的性能,无论您是否为扫描仪创建缓冲文件读取器。底层可读对象将被关闭(如果它是可关闭的,如果您使用Scanner(文件)构造函数,则它将是Closeable),因此只要关闭Scanner对象(或使用try-with-resources),您就不必担心。

1
是的,你可以这样做。
基本上你需要:
Scanner file = new Scanner(new FileReader("file.txt"));

读取字符串:

要读取一个字符串:

String s = file.next();

当你完成文件后,请执行以下操作:

file.close();

-4

这完全没有回答我的问题。如果你要回答,请先仔细阅读问题。请注意:关于使用Scanner还是直接使用BufferedReader存在很多争议。Java提供了两种方式,我正在尝试找出最佳实践,而不是决定是否使用它们。 - orbfish
是的,我已经阅读了它,但并没有回答我的问题,如果你读了我的问题,你就会知道! - orbfish
最好说明偏好的原因 - sachsom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接