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