FileReader的优势与FileInputStream相比具有优势

从我在Stack Overflow上可以看到的内容来看, FileReader只接受文件, FileInputStream可以读取所有文件。 但是使用FileReader有什么好处呢? 它更快吗?

我读到了:

“FileReader不允许您指定编码,而是使用平台默认编码,这使得它几乎没用,因为当代码在具有不同平台默认编码的系统上运行时,使用它会导致数据损坏。”

但是没有得到它。 平台默认编码是什么意思?

主要区别是:
– 基于字节(读或写字节)
读者 – 基于字符(读或写字符)

  • InputStream是一个可以从中读取字节的流。 您通常不会直接使用此类,但如果您这样做,您将期待二进制数据。 它有许多不同的子类用于来自不同源的输入,例如FileInputStreamAudioInputStreamStringBufferInputStream等。

  • InputStreamReaderInputStreamReader的包装器,它使用您喜欢的任何编码将流的字节转换为字符。 通常,在创建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); 

FileInputStreamFileOutputStream用于对象序列化/反序列化。 如果你需要使用字节,也可以使用它。

在其他情况下,您需要字符,因此您应该使用FileReader / FileWriter 。 例如:

 BufferedReader readFile = new BufferedReader(new FileReader(file));