A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lily 黑马帝   /  2011-10-9 08:25  /  3023 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

InputStream,OutputStream,Reader和Writer类的功能有何异同?

7 个回复

倒序浏览
——简短——
InputStream     字节流的基本输入
OutputStream   字节流的基本输出
--------------------------------------------------------------------------------------------------
Reader  字符流的基本输入
Writer   字符流的基本输出

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
IO流的操作方式,分两种:
一种是字符流
另一种是字节流

那么字符流常用于操作文本文件,而字节流则可以操作任何文件,因为计算机中的文件都是以字节的方式存在的,不过建议文本文件还是用字符流来操作,因为中文跟英文不同,一个中文是占两个字节的,如果用字节流来操作很有可以会丢失字节而出现乱码。

具体如果更好地分清什么文件用什么流操作方式可以看毕向东老师讲的IO流方面的视频,里面有讲到怎么样用的规律,觉得很好。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 丁林 于 2011-10-9 09:20 编辑


    所有流类型都继承自你所说的四种抽象流类型。他们是所有流类型的父类。
    其中,InputStream,OutputStream为字节流,Reader、Writer为字符流;
      InputStream、Reader为输入流,OutputStream、Writer为输出流。

  记住下面的图表就行了:
      

             字节流       字符流
  
   输入流  InputStream      Reader

   输出流 OutputStream   Writer



    可以认为所有以Stream结尾的都是字节流;所有以Reader或Writer结尾的都是字符流。
回复 使用道具 举报
似乎是InputStream,OutputStream 可以传输文本和图片    Reader、Writer只能传输文本信息
回复 使用道具 举报
InputStream,OutputStream为字节流,Reader、Writer为字符流
另外InputStream、Reader为输入流,OutputStream、Writer为输出流
InputStream.read()
返回int ,且范围为0到255间int值 ,从输入流读取下一个数据字节(它是以字节为单位来读的,即每次只读取一个字节内容 )。如果因已到达流末尾而没有可用的字节,则返回值-1 。因此该方式不能读取非字符文件(二进制文件),如声音、图片文件等,比如编码为-1的字节内容,通过该方法读取出来后变成了255,因为该方法返回的是一个整型,在读取一个字节后,本来byte型的变量就可以接收该编码了,但它是用的int型变量来存储接收的,所以int型前三字节会以零来补,所以最后本来编码为-1的,最后变成了255。

从上面来看,如果我们读取的是二进制文件,如图片声音文件时,我们应该使用如下两种方式来读取:
第一种 :还是使用InputStream.read(),方法来读取,只不过我们把int型强制转换byte型即可,这样在转换的过程中,会丢弃前三个字节所补的零,最终得到从流中读取的真实的编码:
第二种 :使用InputStream.read(byte[] b)来接收,因为这样不会有byte到int提升的过程,byte数组b里存储的就是真实的编码。

OutputStream.write(int b)
将指定的字节写入此输出流。write 的规定是:向输出流写入一个字节。要写入的字节是参数b的八个低位。b 的24个高位将被忽略。此方法能向文件中写入负数编码,即可写入二进制流的文件,如声音、图片等文件。

我们再来看看Reader与Writer字符流相应方法:

Reader.read
Reader.read:读取单个字符。在有可用字符、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。范围在 0 到 65535 之间 (0x00-0xffff),实质上读取出来的就是一个char型,即为Unicode编码了。如果已到达流的末尾,则返回 -1

Writer. write(int c)
Writer. write(int c):写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。

从上面可以看出是两类字符流,一种是字节流,另一种是字符流,如果我们读取/写入的是一个二进制文件,则使用字节流InputStream.read/OutputStream.write;如果我们读取/写入的是一个字符文件,则使用字符流Reader.read/Writer.write会很方便,当然字符流也可以使用字节流来操作,只是在某些情况下不是很方便。

评分

参与人数 1技术分 +2 黑马币 +3 收起 理由
admin + 2 + 3 赞一个!

查看全部评分

回复 使用道具 举报
陈晓东 黑马帝 2011-10-9 16:54:28
7#
本帖最后由 陈晓东 于 2011-10-9 16:57 编辑


这是一张关于IO流的体系图
IO流的操作规律。
三个明确:
1,明确源(读)和目的(写)。
  其实就是在明确输入流还是输出流。
  源:输入流 InputStream  Reader
  目的:输出流 OutputStream  Writer

2,明确操作的数据内容。
  其实就是在明确字符流还是字节流。
  如果数据都是纯文本数据使用字符流。
  如果数据是非文本数据使用字节流。
前两步已经明确了使用哪一个体系。

3,明确具体的设备。
明确使用的具体对象。
源设备:内存,键盘(System.in),硬盘(文本)(File)。
目的设备:内存,控制台(System.out),硬盘(文件)(File).
扩展部分:需要进行高效操作吗?
是:加入缓冲区技术(Buffered)

相信这样你应该能明白了吧。

回复 使用道具 举报
王家俊 黑马帝 2011-10-10 02:57:24
8#
InputStream和OutputStream是用于操作字节的,Reader和Writer是用于操作字符的。你问的问题可能隐含这字节流与字符流的区别,字节流就是二进制的01形式的,而字符流则是在字符流中融入了编码表,把人看不懂的字节变成了可以看懂的字符,一个字符等于2个字节。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马