【问题标题】:Java - Character and Byte streamsJava - 字符和字节流
【发布时间】:2013-12-10 06:51:04
【问题描述】:

我正在尝试创建一个程序,该程序允许我从本地文件中获取名称并将它们添加到名称的字符串数组中。我不完全理解字符流、二进制流和缓冲流之间的区别,并且在网上查看并没有回答我的问题,即:我将使用哪种类型的流从文本文件中读取以创建字符串数组?

【问题讨论】:

  • 这是关于流实现将如何威胁传入数据,例如。您能否将数据作为字节数组或单个字符(并不总是单字节)。总而言之,每个流都基本相同。
  • 嗯,如果我们都使用字符,为什么人们会使用字节流。 AKA 这个字节流从哪里来?
  • 如果您不想使用字符...如果您只想读取/写入原始/二进制数据..您使用字节流...检查..docs.oracle.com/javase/tutorial/i18n/text/stream.htmlstackoverflow.com/questions/8431787/…跨度>

标签: java iostream


【解决方案1】:

我不完全理解字符流、二进制流和缓冲流之间的区别

缓冲区在这里是一个红鲱鱼 - 这只是一个实现细节,通常是为了提高效率。了解您是在读取二进制数据还是文本数据非常重要。如果你正在阅读一个文本文件,你需要一些描述的Reader。您的文件包含二进制数据(所有文件基本上都是字节),您需要说明如何将其转换为文本。你可以使用FileReader,但我更喜欢使用FileInputStream包裹在InputStreamReader中,因为你可以指定编码在二进制和文本。您需要知道文件的编码,例如UTF-8。

任何InputStream 只返回二进制数据; Reader 返回文本数据。

无论哪种方式,如果您想逐行阅读(不清楚您的数组将由什么组成),您将需要一个 BufferedReader 来包装您的 InputStreamReaderFileReader,因为这提供了一个 readLine()方法。

嗯,如果我们都使用字符,为什么人们会使用字节流。

我们没有。图像文件、音乐、视频、压缩数据、加密数据等本质上不是文本数据。如果您读取带有Reader 的图像文件,您几乎肯定会丢失一些数据。

将文本视为另一种文件格式 - 如果您尝试加载图像以显示它,您需要能够理解该图像文件格式的东西;如果您尝试加载音乐文件来播放它,您需要能够理解该音频文件格式的东西 - 带有文本,InputStreamReader 可以理解文本。

尽管在所有情况下我们在文件级别都有字节,但您使用的类决定了这些字节的解释方式。

【讨论】:

  • 非常感谢!这帮助很大
  • docs.oracle.com/javase/tutorial/essential/io/charstreams.html 上面的链接说“但是,在 CopyCharacters 中,int 变量在其最后 16 位中保存一个字符值;在 CopyBytes 中,int 变量在其最后 8 位中保存一个字节值。 "你能解释一下这是什么意思吗?
  • @tin_tin:这是一个措辞不好的文档,但实际上它的意思是 InputStream.read() 返回一个整数,它要么是 -1,要么是在 0-255 范围内......而 @ 987654335@ 返回一个整数,它可以是 -1,也可以是 0-65535 范围内的整数。当您调用写入整数的最低有效字节的OutputStream.write(int) 以及写入整数的最低有效16 位的Writer.write(int) 时,作为UTF-16 代码单元。
【解决方案2】:

区别很简单。据此tutorial

  1. Byte Streams 处理原始二进制数据的 I/O。
  2. Character Streams 处理字符数据的 I/O,自动处理与本地字符集之间的转换。
  3. Buffered Streams 通过减少对本机 API 的调用次数来优化输入和输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2014-01-19
    • 2011-06-12
    相关资源
    最近更新 更多