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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-8-8 02:42  /  2016 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

InputStreamReader 是字节流通向字符流的桥梁,OutputStreamWriter 是字符流通向字节流的桥梁。我是不是就可以理解成InputStreamReader是字节流转字符流的工具,而OutputStreamWriter是字符流转字节流的工具。
当写入流的对象是System.in时对应的是字节流,这时候为了对数据操作方便需要将字节流转成字符流用到InputStreamReader,而题目的要求将文件数据按照utf-8编码表写入的指定文件中时,就用到了OutputStreamWriter构造函数重新指定编码表。
我的问题是文件最终的是以字节流的形式存放到目标文件的,那么这个结果和以字符流形式存入有什么区别吗?简单的说就是是在输出结果上两者能有什么差别,或者说在什么情况有差别呢?最好能举个例子

评分

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

查看全部评分

5 个回复

倒序浏览
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集
,InputStreamReader 和OutputStreamWriter 类名中都带有Stream,所以又怎么能说后辍是Reader和Writer,那么它两一定就是操作字符的呢!
InputStreamReader 和OutputStreamWriter都是有系统已经定义好的转换类。
InputStreamReader 是字节流通向字符流的桥梁。每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。因为硬盘和内存中数据都是以二进制字节码的形式来进行存储的,要将其从内存中读出来,首先读取的当然是字节码,用到字节流,而读取后打印到控制台上又必须是可识别的字符,所以,要启用从字节到字符的有效转换,而InputStreamReader刚好能实现这一功能
OutputStreamWriter 是字符流通向字节流的桥梁:每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。因为数据写入到内存以及磁盘上都是以二进制存储,所以当然要将字符转换为字节码后,才能存储到内存缓冲区中


你有空看一下毕老师的视频吧,里面好像有

评分

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

查看全部评分

回复 使用道具 举报
樊占江 发表于 2012-8-8 02:52
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使 ...

我就是看过视频后产生的疑问
回复 使用道具 举报
InputStreamReader 是字节流通向字符流的桥梁,OutputStreamWriter 是字符流通向字节流的桥梁。
举个例子分析这两句话.
new BufferedReader(new InputStreamReader(System.in));
new BufferedWriter(new OutputStreamWriter(System.out));
首先要知道输入流的终点是内存,而输出流的起点是内存。
InputStream(System.in)-->InputStreamReader-->BufferedReader-->内存中(字符流)
其中inputStreamReader是将字节流转化为字符流.
内存中(字符流)-->BufferedWriter-->OutputStreamWriter-->OutputStream(System.out)
调用bufferWriter的write方法,从内存中读取刚才读进来的字符流,bufferWriter的write会调用OutputStreamWriter的write方法,而outputStreamWriter的write方法会调用outputStream的write方法,最终以字节流的形式输出.
从键盘获得字节输入流转化成了字符,输出时就是从内存中的字符流到字节流了.

题目的要求将文件数据按照utf-8编码表写入的指定文件中时,必须使用OutputStreamWriter转换流.
如果用默认的编码表操作纯文本数据时,以字节流或字符流形式存入的结果没有区别.
字节流读取的时候,读到一个字节就返回一个字节,字符流使用了字节流读到一个或多个字节时,先去查指定的编码表,将查到的字符返回.
字符流其实就是基于字节流读取字节时,去查找了指定的编码.

评分

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

查看全部评分

回复 使用道具 举报
带Reader和Input的,都是输入流
带Writer和Output的,都是输出流
Reader与Writer都是字符型
Stream是字节型

同事有Stream和Reader或Writer的,是字符与字节的转换流。
自己写程序时候用的不多,但还是能用上。我觉得这个东西你在API里能得到很好的解释
带缓存的类前面都有Buffered这个单词。
回复 使用道具 举报
本帖最后由 杜佳瑞 于 2012-8-8 11:02 编辑
李敬 发表于 2012-8-8 04:13
InputStreamReader 是字节流通向字符流的桥梁,OutputStreamWriter 是字符流通向字节流的桥梁。
举个例子分 ...


你说的已经很详细了,可是我的疑惑是以字节流输出时,比如说在指定.txt文件里面存入几个汉字“黑马”,那么在存储的时候是不是应该以字节的形式存储呢,可是打开后还是汉字“黑马”呀。
读的时候是先读到一个多个字节,再查表,以查到的字符返回;
那么写的时候,是不是从返回的字符里面查表,得到相应的多个字节,再存储起来呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马