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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sbeeqnui1987 中级黑马   /  2012-6-15 09:06  /  1619 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sbeeqnui1987 于 2012-6-19 21:41 编辑

从逻辑上来解释的话,BufferedOutputStream为流开辟了一个缓冲区,InputStream获取的数据先写入缓冲区,再交给由OutputStream的实现类完成标准输出,BufferedOutputStream只是一个中间过程,并没有输出的功能

从代码上解释的话,BufferedOutputStream中只封装了缓冲数据用的成员变量,而没有输出的方法,构造器接收到OutputStream的实现类再调用该类的方法完成输出.

我的理解是这样的:字符流在向文件输入数据时,到达缓冲区时,已经完成转换了,那岂不是OutputStreamWriter 和Writer的功能一样了?都是在送到缓冲区时,字符转换成字节,不知对吗?

3 个回复

倒序浏览
OutputStreamWriter是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。(即用字符流的方式写字节流)Writer会一个字节一个字节的把内容写入文件,这种速度多么慢。而outputstreamwriter是带有缓存的,用它包装了writer之后,writer就不会直接往文件中写,而是交给outputstreamwriter,然后就会往缓存中写,待Writer操作完成,OutputStreamWriter再一次性写入文件,效率大大提升。
回复 使用道具 举报
额,OutputStreamWriter 和Writer的功能当然不一样。OutputStreamWriter是在把数据输入缓冲区时把字节流转换成字符流,而Writer只会一个字节一个字节的把内容写入文件。字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。字节主要是读一些如音乐文件、视频文件,而字符流就相对宽松一些了,如文本文件。至于为什么非要用OutputStreamWriter而不直接用Writer是因为Writer读入速度非常慢,而outputstreamwriter是带有缓存的,用它包装了writer之后,writer就不会直接往文件中写,而是交给outputstreamwriter,然后就会往缓存中写,待Writer操作完成,OutputStreamWriter再一次性写入文件,效率大大提升。
回复 使用道具 举报
[b]字节主要是读一些如音乐文件、视频文件(可以理解那些比较细腻精度要求高的文件),而字符流就相对宽松一些了:如文本文件…… 
OutputStreamWriter 是字符流通向字节流的桥梁,它使用的字符集可以由名称指定或显式给定。 每次调用 write() 方法都会导致在给定字符上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。默认的缓冲区对多数用途来说已足够大。但是,传递给 write() 方法的字符没有缓冲。 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如: Writer out= new BufferedWriter(new OutputStreamWriter(System.out));
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马