根据我在Stack Overflow上可以阅读的内容, FileReader 只接受文件, FileInputStream 可以读取所有文件。但是使用 FileReader 有什么好处吗?它更快吗?
我读到了:
“FileReader不允许您指定编码而是使用 平台默认编码,这使它几乎无用 当代码在系统上运行时,使用它将导致数据损坏 使用不同的平台默认编码。“
但是没有得到它。平台默认编码是什么意思?
答案 0 :(得分:14)
主要区别是:
流 - 基于字节(读取或写入字节)
读者 - 基于字符(读或写字符)
答案 1 :(得分:12)
InputStream
是一个可以从中读取字节的流。你通常不会直接使用这个类,但如果你这样做,你就会期待二进制数据。它有许多不同的子类用于来自不同来源的输入,例如FileInputStream
,AudioInputStream
,StringBufferInputStream
等等。
InputStreamReader
是InputStream
的包装器,它使用您喜欢的任何编码将流的字节转换为字符。通常,您在创建InputStreamReader
时指定字符编码。有一些不同的构造函数可以让你这样做。如果要阅读文本数据,可以使用InputStreamReader
。首先让您的InputStream
读取数据,然后将其换成InputStreamReader
。
FileReader
是一个专门的InputStreamReader
,只能读取文件,并使用默认的平台编码。换句话说,它假定它所读取的文件是根据操作系统的平台编码设置创建的。这通常没问题;但如果您要阅读使用不同编码的文件,则应创建FileInputStream
并将其包装在InputStreamReader
中。
答案 2 :(得分:2)
平台默认编码,表示运行JVM的操作系统使用的编码。
答案 3 :(得分:2)
如果您在Windows中,请转到控制面板 - >区域和语言选项控制面板 - >高级那里你会看到默认编码。 FileReader始终使用该编码。
FileReader与FileInputStream的不同之处在于FileReader用于读取默认编码的文本文件,而FileInputStream用于读取二进制文件。
答案 4 :(得分:0)
FileReader
是字符流,而FileInputStream
是字节流。在第一种情况下,默认编码是相关的(例如,将InputStreamReader
视为中间桥)。
如果您想要字符流的另一种编码(即Reader
),请使用:
FileInputStream in = ...;
String charSet = ...; // for example UTF-8
Reader reader = new InputStreamReader(in, charSet);
答案 5 :(得分:0)
FileInputStream
和FileOutputStream
用于对象序列化/反序列化。
如果你需要使用字节,也可以使用它。
在其他情况下,您需要字符,因此您应该使用FileReader
/ FileWriter
。
例如:
BufferedReader readFile = new BufferedReader(new FileReader(file));