本帖最后由 周兴中 于 2012-6-27 05:05 编辑
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
Writer out
= new BufferedWriter(new OutputStreamWriter(System.out));
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in
= new BufferedReader(new InputStreamReader(System.in));
一般成对使用,至于为什么能直接读取字符,那是因为一个字符一般由两个字节组成(按照默认编码方式的情况下),它们是可以相互转换的,在操作系统中,都是有1和0组成,只是编码方式的不同而已,所以根据文件编码方式的不同,可以在使用转换流的时候设置对应文件所使用的字符集来进行编码和解码,之所以用使用转换流,是因为为了提高读写效率,而加入缓冲流,并且缓冲区有比较特殊的方法适用我们特定的程序设计要求,例如readLine():一次读一行文本,newLine():添加一个跨平台的换行符. |