基本的I / O问题

时间:2009-12-09 13:56:27

标签: java

Reader和InputStream有什么区别?
或者换句话说,“字节流”和“字符流”之间的区别是什么? 我想知道何时应该使用InputStream或者Reader,你能否建议我自己理解这个问题的材料?

7 个答案:

答案 0 :(得分:8)

一个是字节序列(二进制数据),另一个是字符序列(文本)。字节和字符是完全不同的东西(不要相信C标准,它就在于它!)。您可以使用字符编码在它们之间进行转换 - 这就是例如InputStreamReader确实如此。

进一步阅读材料:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

答案 1 :(得分:2)

基本I / O问题导致Basic I/O tutorial:)

InputStream / OutputStream处理字节,Reader / Writer处理多字节字符。

答案 2 :(得分:1)

基本上,Reader使用对人类可读文本有用的类型char

Reader

  

...用于阅读字符流的课程......

Stream直接使用对二进制数据有用的类型byte

InputStream

  

.. class [..]表示输入的字节流...

链接以进一步阅读:Java I/O streams

引用:

  

除非您使用的是二进制数据,例如图像和声音文件,否则您应该使用读者和编写者(字符流)来读取和写入信息,原因如下:

     

- 它们可以处理Unicode字符集中的任何字符(而字节流仅限于ISO-Latin-1 8位字节)。

     

- 它们更容易国际化,因为它们不依赖于特定的字符编码。

     

- 他们在内部使用缓冲技术,因此可能比字节流更有效。

文章的日期为'98,但它仍然有效。

答案 3 :(得分:0)

来自Java - Primitive Data Types

  

byte:字节数据类型是一个8位带符号的二进制补码整数。   它的最小值为-128和a   最大值127(含)。该   字节数据类型可用于   在大型数组中保存内存,其中   记忆储蓄实际上很重要。   它们也可以用来代替int   他们的限制有助于澄清   你的代码;一个变量的事实   范围有限可以作为一种形式   文件。

     

char: char数据类型是一个16位Unicode字符。它   最小值为'\ u0000'(或0)   和'\ uffff'的最大值(或   65,535(含))。

答案 4 :(得分:0)

InputStreams处理最低级别的原始数据。读者处于略高的抽象层次,处理字符(最终仍然在底层字节流中编码)

答案 5 :(得分:0)

作为涵盖Java IO的大型教程的一部分,可以很好地概述各种InputStream,OutputStreams,Reader和Writer的差异:

http://tutorials.jenkov.com/java-io/overview.html

答案 6 :(得分:0)

简单说明:在记事本或其他文本编辑器中打开感兴趣的文件。可以读它,好像它是一种自然语言吗?那么你可能需要一个Reader来用Java读取它,你最终会得到字符串。你反而看到一些“垃圾”吗?然后你需要InputStream来用Java读取它,你最终会得到字节数组(或流)。二进制文件的已知示例是图像文件(gif,jpg,png等)和office文档(doc,xls,ppt,pdf等)。

您也可以使用InputStream打开文本文件,但实际上您不希望使用Reader打开二进制文件,因为无法进行任何字符编码。使用OutputStreamWriter时也会遇到同样的情况。在任何情况下都不要使用Writer来创建二进制文件。