黑马程序员技术交流社区

标题: 关于IO流中转换流的 [打印本页]

作者: 王涛    时间: 2012-6-27 02:31
标题: 关于IO流中转换流的
import java.io.*;
public class OutputStreamWriterDemo01
{
        public static void main(String[] args) throws Exception
        {
                File f = new File("d:" + File.separator + "test01.txt");
               
                Writer out = null;
                out = new OutputStreamWriter(new FileOutputStream(f));

              //就这个,能不能给我讲讲这个转换流到底是把什么流转换成了什么流
              //还有那个InputStreamReader,这两个我迷了好几天了,
              //总是想不出到底是怎么转换的,转换过怎么可以直接读字符
              //他转换过程中,数据,也就是字节,是怎样“变化”的?

                out.write("Hello world");
               
                out.close();

        }
}
谢谢了啊,O(∩_∩)O~


作者: 周兴中    时间: 2012-6-27 05:03
本帖最后由 周兴中 于 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():添加一个跨平台的换行符.
作者: 赵庆礼    时间: 2012-6-27 09:53
      InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in
   = new BufferedReader(new InputStreamReader(System.in));

      OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
Writer out
   = new BufferedWriter(new OutputStreamWriter(System.out));

这是我从jdk api上复制的,你在好好看看
作者: 郑森123    时间: 2012-6-27 10:23
字节流可以被包装成字符流
一下是最简单的一个过程
01.//创建字节流   
02.FileOutputStream fos = new FileOutputStream(new File("F:\\testSource\\newFile2.txt"));  
03.//转换流包装输出流(将字节流转换成字符流)   
04.OutputStreamWriter osw = new OutputStreamWriter(fos);  
05.//向流中写入字符   
06.osw.write("this ");  
07.osw.write("is ");  
08.osw.write("OutputStreamWriter");  
09.//将流刷入文件   
10.osw.flush();  
11.//流关闭   
12.fos.close();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2