我对Java中的文件和FileReader类之间的区别感到有点困惑,它们都以同样的方式为我工作,因为它们可以获取文本文件并将其输入到数组中,但哪一个实际上更有效使用,哪种情况最适合在这种情况下使用。
我知道这样的问题已被提出,但他们倾向于关注具体的代码或两个类的方法。
谢谢。
答案 0 :(得分:1)
就内存效率而言,FileInputStream更有效,因为它读取单个字节。 FileReader读取字符,每个字符为四个字节。
答案 1 :(得分:1)
使用File
类来表示文件(即现有文件的路径,或者您可能要创建的文件的路径)。
如果要读取字节,请使用FileInputStream
(可能将其包装在BufferedInputStream
中)。
如果要阅读字符(即文本文件或类似文件),请使用FileReader
(可能将其包装在BufferedReader
中)。您可能希望指定编码(如果您知道),或者可能更喜欢依赖于系统(OS)默认编码 - 这取决于您的用例。
此外,编写一般实用程序方法更喜欢只接受InputStream
或Reader
。例如,public static void copy(Reader r, Writer w) throws IOException
比public static void copy(FileReader r, FileWriter w) throws IOException
更有用(可重复使用)。通常,只有在不能使用更通用的抽象(例如Reader
)时才使用特定的类型。
答案 2 :(得分:1)
java.io.File
代表文件本身 - 它的存在,无论是文件或目录,最后修改日期等。您无法使用任何方法读取文件的内容在File
班。
但是,您可以使用File
作为另一个类的输入,例如java.io.FileReader
,然后允许您读取文件的内容。
最终,阅读文本文件的速度归结为您想要使用它们的速度。配置代码以查看哪种方法花费的时间最长。您可以将java.io.FileReader
,java.util.Scanner
甚至java.nio.channels.FileChannel
与java.nio.charset.CharsetDecoder
结合使用。
正如您所说,您正在阅读文本文件,您应该坚持使用类来读取字符流,而不是读取原始字节的类。这使您可以正确读取ASCII字符。