InputStreamReader和FileReader的区别

34

除了两者初始化的方式之外,我似乎无法确定InputStreamReaderFileReader之间的任何区别。使用其中之一是否有任何好处?大多数其他文章都涵盖了FileInputStreamInputStreamReader的对比,但我要与FileReader进行对比。在我看来,它们都具有相同的目的。


看看这个问题,它有来自我最喜欢的三个SO用户(仅限于他们)的答案!(Jon Skeet是超级喜欢的) - Koray Tugay
3个回答

57

首先,InputStreamReader 可以处理所有输入流,不仅限于文件。其他示例包括网络连接、类路径资源和ZIP文件。

其次,在Java 11之前,FileReader 不允许您指定编码,而是仅使用平台默认编码,这使得它几乎无用,因为在不同平台默认编码的系统上运行代码时,使用它会导致数据损坏。

自Java 11以来,FileReader 是一个有用的快捷方式,可以将 InputStreamReader 包装在 FileInputStream 中。


1
这是我第一眼看到时的想法(从跨平台的角度来看),但我想知道他们为什么要实现FileReader - Spliff
7
从这个角度来看,API中隐含使用默认编码的所有部分都是一个不好的想法;我猜当时设计API时这似乎并不是那么大的问题。但我真的不理解的是为什么他们还没有添加一个可以传入编码的FileReader构造函数。 - Michael Borgwardt
1
读取7500000行字符串文件, br = new BufferedReader(new InputStreamReader(fileInputStream)); // 需要20分钟 br = new BufferedReader(new FileReader(file)); // 只需要3分钟, 所以在我的情况下FileReader比InputStreamReader快得多 - Ashish Dwivedi
1
@DwivediJi:导致性能差异的原因与FileReader或InputStreamReader无关,因为FileReader只是InputStreamReader的一个子类,它添加了一些构造函数,将参数包装在FileInputStream中。 - Michael Borgwardt
3
在Java 11中,FileReader新增了一个构造函数,允许您指定字符集。 public FileReader(File file, Charset charset) throws IOException - Vyacheslav Babanin

9

FileReader 是从文件系统中读取字符的类。InputStreamReader 可以从任何类型的输入流中读取字符,这些流可以是 FileInputStream,也可以是从套接字、HTTP 连接、数据库 blob 等获取的流。

通常我更喜欢使用包装 FileInputStream 的 InputStreamReader 从文件中读取数据,因为它允许指定特定的字符编码。


3

FileReader继承自InputStreamReader。唯一的区别在于,FileReader有构造函数假设你正在从文件中读取,例如String filenameFile fileFileDescriptor fd

我建议您查看FileReader的源代码以获取更多信息。


1
那么FileReader专门用于流式传输文件(不允许其他类型的流),而InputStreamReader也可以实现相同的功能,但是还可以接受其他类型的流吗? - Spliff
1
@Spliff:API文档已经明确说明了:“用于读取字符文件的便捷类。该类的构造函数假定默认的字符编码和默认的字节缓冲区大小是适当的。如果要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。” - Michael Borgwardt
正是API文档中的“bridge”术语让我感到困惑,好像它们彼此紧密相连,必须一起使用;好像我不能仅使用InputStreamReader完成它。 - Spliff

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