从本质上讲,wirter/reader和inputstream/outputstream的最大区别在于encode和decode.inputstream/outputstream 直接对byte[]进行操作,不会更改任何信息,原原本本的反应数据内容。
writer/reader在操作时会进行decode/encode. 它会根据你的系统属性file.encoding来decode数据。比如你从文件中读取一行,用reader.readLine()返回的string是经过decode的数据。如果你的文件的encoding不等于你的file.encoding的值,就会产生编码错误。

解决方案 »

  1.   

    reader writer 主要是为了处理国际化问题,请参看Core java 2:advanced features
      

  2.   

    一百分呀!
    InputStream and OutputStream是以byte为单位进行操作
    Reader and Writer 是以char为单位进行操作。
      

  3.   

    同意lika()的说法,主要是为了解决国际化问题。如果你全不使用e语,那么用不用reader何writer关系不大,试想将一个中文字符勇stream读取,那系统会首先将中文的两个字节一个一个读入,但输出的时候就不会将这两个字节再组合一起输出一个中文,而只会根据每个字节的实际字符显示,而我们看起来就变成乱码了。
      

  4.   

    上面几位说的我以前就知道了,所谓国际化问题不就是处理多语言的问题吗?可是hellking(信息孤岛)老兄说的decode/encode是我所不知道的,可是你说的也太少了,能不能具体一点啊?
      

  5.   

    从本质上来说,是很明显的。下面是java.sun.com上的原话:To read and write 8-bit bytes, programs should use the byte streams, descendants of InputStream and OutputStream.Reader provides the API and partial implementation for readers--streams that read 16-bit characters--and Writer provides the API and partial implementation for writers--streams that write 16-bit characters.
    接分。
      

  6.   

    这个byte oriented和unicode oriented的问题我明白,我觉得hellking(信息孤岛)老兄说的有理的地方是啥呢?当你打开一个文本文档并把它打印的时候,你怎么知道它的文字是用ascII写的,还是用汉语,或是日语写的呢?如果这种情况下用writer的descendants来实现就能正确的打印吗?
      

  7.   

    一般情况下,你是应该知道文件的内容的,因为在大多数情况下,我们是知道文件里的内容是什么,而用流读取它只是为了解析它或者取得其中某几个数据,这是比较常见的。假使你不知道,那么用byte读是最诚实的,一个一个byte读出来,假使你发现不行,那就用reader()读了,反正就这两种了,其他好象也没办法了:)
      

  8.   

    你在处理文件的时候一定要知道里面放的是assic还是其他的编码。不然没得搞啊,因为没有一个getEncode()这样的方法啊。我的理解是,在处理需要用户直接看懂的数据的时候,用unicode,在处理不需要用户看懂的时候就用byte啊。