【问题标题】:What actually happens when using FileInputStream instead of FileReader?使用 FileInputStream 而不是 FileReader 时实际发生了什么?
【发布时间】:2013-06-17 07:55:31
【问题描述】:

我已阅读this oracle java 教程,它基本上表明您可以使用FileInputStreamFileReader 复制一个txt 文件。尽管他们建议使用后一种方法,但我有一个问题。 我想知道使用 FileInputStream 的第一种方法会发生什么,该方法基本上读取纯原始字节。

来自这个link

public class FileInputStream extends InputStream

FileInputStream 从文件系统中的文件获取输入字节。 可用的文件取决于主机环境。 FileInputStream 用于读取原始字节流,例如 图像数据。对于读取字符流,请考虑使用 文件阅读器。

如果它打算只读取原始字节并且没有将字节桥接到字符的InputFileReader。为什么只使用FileInputStream,它仍然有效?

【问题讨论】:

  • 经验法则:FileInputStream 不会出错。如果您对文本没有特定需求,请使用它。

标签: java inputstream fileinputstream


【解决方案1】:

正如您所指出的,FileInputStream(或通常InputStream 用于将原始数据读取为字节,而FileReader(或通常Reader)用于读取字符数据。

Reader 将为您将读取的字节转换为字符。 Reader 将使用默认平台编码或构造函数中给定的编码进行此转换。

复制带有FileInputStream 的文本文件是可行的,因为在磁盘上,即使是文本文件也只包含字节。

【讨论】:

  • 好的,所以基本上字节被转换成整数,然后从 FileOutputStream 再次读取它们时,反之亦然。?
  • @Rollerball 写入 FileOutputStream 时,您将字节直接(无需转换)写入磁盘。
  • @Rollerball 关键是,根据编码,并非每个字符都适合一个字节(例如 UTF-8 编码)。在您离开 ASCII 字符之前,您不会看到 FileInputStream 的问题。不过,对于复制来说,这并不重要——重要的是复制所有字节。
【解决方案2】:

我不太确定您在问什么,但我认为您正在寻找的是 InputStreamReader (link),它用于将字节流转换为字符。将字节流转换为字符流时需要小心,因为 unicode 可以(并且经常)每个字符使用多个字节。

【讨论】:

    【解决方案3】:

    FileInputStream 可以是来自任何文件的字节流,例如一个 mp3 文件:它只是关于“如何将任何文件放入我的 java 运行时?”的答案。 FileReader 适用于 .txt 格式等字符文件。当然,您也可以将它用于任何文件,但是当您使用 FileReader 读取字符时,您可能会遇到编码错误。记住字节是 utf8 编码的,默认字符是 ascii。

    【讨论】:

    • “当然你也可以用它来处理任何文件”
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2011-04-29
    • 2013-07-06
    • 2016-03-17
    • 2014-05-31
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多