Java InputStreamReader与FileReader

Java InputStreamReader与FileReader,java,stream,Java,Stream,我似乎无法确定InputStreamReader和FileReader之间的区别,除了它们的初始化方式。使用其中一个有什么好处吗?大多数其他文章都涉及FileInputStreamvsInputStreamReader,但我与FileReader相反。在我看来,它们都有相同的用途。FileReader扩展了InputStreamReader。唯一的区别是FileReader的构造函数假定您正在从文件中读取,例如字符串文件名、文件文件文件和文件描述符fd 我建议您查看FileReader的源代码以

我似乎无法确定
InputStreamReader
FileReader
之间的区别,除了它们的初始化方式。使用其中一个有什么好处吗?大多数其他文章都涉及
FileInputStream
vs
InputStreamReader
,但我与
FileReader
相反。在我看来,它们都有相同的用途。

FileReader扩展了InputStreamReader。唯一的区别是FileReader的构造函数假定您正在从文件中读取,例如
字符串文件名
文件文件文件
文件描述符fd


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

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

其次,
FileReader
直到Java 11才允许您指定编码,而只使用plaform默认编码,这使得它非常无用,因为当代码在具有不同平台默认编码的系统上运行时,使用它会导致数据损坏


由于Java 11,
FileReader
是一种有用的快捷方式,用于将
InputStreamReader
包装在
FileInputStream


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

因此,文件读取器专门用于流文件(不可能有其他类型的流),而InputStreamReader也有同样的功能,但也接受其他类型的流?@Spliff:API文档详细说明了这一点:“用于读取字符文件的便利类。此类的构造函数假定默认字符编码和默认字节缓冲区大小是合适的。要自己指定这些值,请在FileInputStream上构造InputStreamReader。“这是API文档中的“桥梁”术语,好像一个与另一个紧密相连,它们都需要在一起;好像我无法单独使用
InputStreamReader
来完成。这是我第一眼看到的(从跨平台的角度看),但我想知道为什么他们甚至实现了
FileReader
@Spliff:从这个角度来看,API中所有隐式使用默认编码的东西都是一个坏主意;我猜在设计API时,这似乎不是一个问题。我真的不明白的是,为什么他们仍然没有添加FileReader construct接受编码的ctor。要从文件中读取7500000行字符串,br=new BufferedReader(new InputStreamReader(fileInputStream));//需要20分钟br=new BufferedReader(new FileReader(file));//需要3分钟,所以在我的例子中,FileReader比InputStream快得多Reader@DwivediJi:无论导致性能差异的原因是什么,它与FileReader或InputStreamReader无关,因为FileReader只是InputStreamReader的一个子类,它添加了一些构造函数,将参数包装在FileInputStream中。在Jav中FileReader中添加了11个新的构造函数,允许您指定Charset
公共FileReader(File File,Charset Charset)抛出IOException
看看这个问题,它有来自(仅来自)我最喜欢的3个SO用户的答案!(Jon Skeet非常喜欢)