我想请教大家一个问题。
我看到大家写输入输出流时常常是这写的:
new BufferedReader(new InputStreamReader(new InputStream()));
new BufferedWriter(new PrintWriter(new OutputStream()));
可我觉得像下面这样搭配似乎看起来更符合习惯、直观:
new BufferedReader(new InputStreamReader(new InputStream()));
new BufferedWriter(new OutputStreamWriter(new OutputStream()));
但为什么大家用的都是上面一种方式呢?OutputStreamWriter和PrintWriter之间是什么关系,有什么区别,为何后者会替代前者使用?
p.s.参考外国网友的回答,我的理解是前者是输出字节码,而后者是输出字符?丈二摸不着头脑。
整个流的设计时装饰者模式,所以每种不同实现都是含有不同的实现。字节流和字符流是不同的,
用字节流读字符数据或用字符流读字节数据都会出现丢失,这个区别为什么还不够呢?
用哪个要看你读的是什么类型的数据,复制个文件肯定是字节流,读取文件内容肯定是字符流。
PrintWriter以字符为单位,支持汉字,OutputStreamWriter以字节为单位,不支持汉字,前辈已经写过了->http://blog.csdn.net/rushkid02/article/details/7314881
楼上把网站贴出来了 去看看吧 非常不错
能百度到的东西我就不解释了。
OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。
每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。在写入基础输出流之前,得到的这些字节会在缓冲区累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递到此 write() 方法的字符是未缓冲的。
为了达到最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中以避免频繁调用转换器。例如:
Writer out
= new BufferedWriter(new OutputStreamWriter(System.out));
public class PrintWriterextends Writer向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出新行字符时才完成。这些方法使用平台自有的行分隔符概念,而不是新行字符。
此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。