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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zcbyzcb 中级黑马   /  2013-7-13 17:46  /  2255 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-14 11:07 编辑

字符流转换为字节流,很明显能感受到InputStreamReader的作用,但是OutputStreamWriter的作用还是有些小困惑,首先,BufferedWriter bufw=new BufferedWriter(new OutputStreamReader(System.out)); 用bufw.write(); 可以把一行数据写到控制台上,用System.out.println()貌似可以很好解决
其次, 应该就是把数据写到一个文件里了,直接用BufferedWriter =new BufferedWriter(new FileWriter("1,txt")); 也很好用
这样的装饰,是不是,对于二进制的文件可以整行的读写,这样的好处呢,求解

评分

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

查看全部评分

10 个回复

正序浏览
wll_sx1990 发表于 2013-7-13 21:40
我把你的问题分为三个回答吧:
/*
字符流转换为字节流,很明显能感受到InputStreamReader的作用,但是Outpu ...

多谢,很受益
回复 使用道具 举报
本帖最后由 刘利民 于 2013-7-13 22:12 编辑
王靖远 发表于 2013-7-13 21:47
这也面前算是转换流吧,api里都写了是字符流通向字节流的桥梁了。

      假设它是字符转字节流:也就是OutputStreamWriter()方法是将字符流转为字节流,但是为什么它的构造方法的参数传递的却是OutputStream,不是应该传递字符流吗,但是却传递了一个字节流,为什么?
       所以应该不算吧,我觉得API文档里的解释有点会让人混淆概念,OutputStreamWriter作用是把字节流转换成字符流,以达到在内存(代码)中操作的目的,操作完成之后,把要输出的内容,也就是字符流变为字节流输出文件。但它确实是字节转字符的流。
回复 使用道具 举报
刘利民 发表于 2013-7-13 21:44
我觉得Charset虽然可以将写入流中的字符编码成字节,不是转换流的概念。

这也面前算是转换流吧,api里都写了是字符流通向字节流的桥梁了。
回复 使用道具 举报
王靖远 发表于 2013-7-13 21:13
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
...

我觉得Charset虽然可以将写入流中的字符编码成字节,不是转换流的概念。
回复 使用道具 举报
本帖最后由 wll_sx1990 于 2013-7-13 21:57 编辑

我把你的问题分为三个回答吧:
/*
字符流转换为字节流,很明显能感受到InputStreamReader的作用,但是OutputStreamWriter的作用还是有些小困惑,首先,BufferedWriter bufw=new BufferedWriter(new OutputStreamReader(System.out)); 用bufw.write(); 可以把一行数据写到控制台上,用System.out.println()貌似可以很好解决
*/
1、
对于这个问题,OutputStreamWriter和BufferedWriter是有区别的,
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
          Creates an OutputStreamWriter that uses the given charset encoder.
看到了没,这是java官方对outputStreamWriter的其中一种构造方法的定义,其中有字符编码的要求,而在BufferedWriter的构造函数中则没有这样的要求。所以,他们的一个很显著地区别在于编码的控制。从另一个方面说,bufferedWriter是将字符流进行了包装,可以说他是与字符流打交道的,而InputStreamWriter是直接与字节流打交道的,这也是它可以控制编码的原因。

2、对于System的out对象的println方法,其中的out就是PrintStream,它具备将字符串输出到控制台的函数,这个函数是先将字符串输出,然后输出换行。你知道PrintStream的构造函数吧,它也是与字节流打交道的,所以他也可以控制编码。对于BufferedWriter我想你是清楚的。

/*
其次, 应该就是把数据写到一个文件里了,直接用BufferedWriter =new BufferedWriter(new FileWriter("1,txt")); 也很好用
这样的装饰,是不是,对于二进制的文件可以整行的读写,这样的好处呢,求解
*/
3、对于这第三个问题,对于二进制文件,千万不要用字符流读写,如果你用字符流读写一部电影那么这个电影最后要么不能播放,要么是缺鼻子少眼,因为字符流在内部是对字节进行了处理的,通常就是两个字节转换为一个字符,这样在拷贝电影的时候,就会出现当初编码和最后解码的不一致的现象,所以不要用字符流读写二进制文件数据,而且这样效率低。

评分

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

查看全部评分

回复 使用道具 举报
刘利民 发表于 2013-7-13 18:48
首先更正一下错误:Java里暂时没有提供字符转字节的转换流。

       如果使用非默认编码保存文件或者读取 ...

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
回复 使用道具 举报
楼上高建。
楼主的问题回答,二进制文件不能整行读取的,整行读取是读取文本文件的,二进制文件你怎么知道是按行存储的呢?
好处,这两个类的好处就是处理文本字符的编码的,方便
回复 使用道具 举报
首先更正一下错误:Java里暂时没有提供字符转字节的转换流。

       如果使用非默认编码保存文件或者读取文件时,需要用到转换流,因为字节流的重载构造方法中有指定编码格式的参数,而FielReader 与 FileWriter 是默认编码的文本文件
     1.  比如:当我们使用默认的GBK编码输出时,下面的代码其实是一样的。
                 new OutputStreamWriter(new FileoutputStream("demo.txt"));
             与new FileWriter("demo.txt");
         但当,我们要使用UTF-8等其它编码时,new FileWriter("demo.txt");不行,因为它默认是GBK。
                正确方式应该是:new OutputStreamWriter(new FileoutputStream("demo.txt"),"utf-8");
          此时我们如果要读取这个UTF-8的文件,也要同样的要用:
                  new InputStreamReader(new InputStreamReader("demo.txt"),"UTF-8");
             而不能用,new FileReader("demo.txt");其原理一样。

     2.当文件是字节文件时:
     读取:提高效率用BufferedReader的独有快速方法时,需要转换。
     输出:提高效率一般用BufferedWriter缓存,需要转换。

    说得不是很具体,但希望能给你带来一些帮助,

评分

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

查看全部评分

回复 使用道具 举报
你的问题我看了好几遍 还是有点没懂 不知道我理解的对不对
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
BufferedWriter =new BufferedWriter(new FileWriter("1,txt"));
这两个一个是用来操作字节的 一个是用来操作字符的
要用哪个是看你的需求的
转换流的应用归根结底不还是为了提高效率嘛

评分

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

查看全部评分

回复 使用道具 举报
BufferedWriter =new BufferedWriter(new FileWriter("1,txt")); 你这个还是字符流。OutputStreamWriter的意义是把字符流转成字节流。写入的是字节。而不是字符。你用之前的那个写入的是字符,是根据编码表写的。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马