黑马程序员技术交流社区

标题: 关于转换流类OutputStreamWriter的一个疑问 [打印本页]

作者: 钱智慧    时间: 2012-3-4 11:09
标题: 关于转换流类OutputStreamWriter的一个疑问
JDK文档说OutputStreamWriter是字符流通向字节流的桥梁,可为何它的构造参数传递进来的却是字节流对象?
它是如何将字符流转为字节流的?有高人可否为小弟举个例子么?
作者: 杨盼    时间: 2012-3-4 11:31
这个就是字节流转成字符流,API上介绍就是“字符流通向字节流的桥梁”,但在实际应用中却是字节流到字符流,你找份原版的API看看吧
作者: 尹震    时间: 2012-3-4 11:51
OutputStreamWriter 是指将字节流转换为字符流,反之则抱歉,没有。
作者: 钱智慧    时间: 2012-3-4 12:04
杨盼 发表于 2012-3-4 11:31
这个就是字节流转成字符流,API上介绍就是“字符流通向字节流的桥梁”,但在实际应用中却是字节流到字符流 ...

您的意思就是中文的JDK说法有误了?
作者: H07000223    时间: 2012-3-4 13:40
本帖最后由 H07000223 于 2012-3-4 13:41 编辑

你不接收一个字节流对象,那你用OutputStreamWriter往哪写啊。

他总的有个对象,目标吧。比如说:
FileOutputStream fos=new FileOutputStream("file.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos);
这就是说要写到file.txt文件里啊。不然的话找不到输出对象啊。

写个例子吧,你自己再试试。
                  FileOutputStream fos=new FileOutputStream("file.txt");
                OutputStreamWriter osw=new OutputStreamWriter(fos);
               
                BufferedWriter bw=new BufferedWriter(osw);
               
                bw.write("hello\n");
                bw.write("world\n");
                bw.write("welcome!")

                bw.close();
作者: 王思兰    时间: 2012-3-4 14:09
InputStreamReader是字节流通向字符流的桥梁,read方法会把一个字节转换成4个位的int类型,相对应的OutputStreamWriter的write(int c)方法则会把字符强制转换为字节,所以OutputStreamWriter是字符流通向字节流的桥梁
作者: 王思兰    时间: 2012-3-4 14:12
我好像弄错了,我混乱了
作者: 杨盼    时间: 2012-3-4 14:32
钱智慧 发表于 2012-3-4 12:04
您的意思就是中文的JDK说法有误了?

看帮助文档一般都要看原版的,翻译的出错也不是不可能啊
作者: 陈斌    时间: 2012-3-4 14:33
Writer会一个字节一个字节的把内容写入文件,如果你有丰富编程经验的话,就会知道这种速度会多么慢。而outputstreamwriter是带有缓存的,用它包装了writer之后,writer就不会直接往文件中写,而是交给outputstreamwriter,然后就会往缓存中写,待Writer操作完成,OutputStreamWriter再一次性写入文件,效率大大提升。
例子:
  FileOutputStream fos=new FileOutputStream("file.txt");
                OutputStreamWriter osw=new OutputStreamWriter(fos);
                BufferedWriter bw=new BufferedWriter(osw);
作者: 钱智慧    时间: 2012-3-4 14:53
王思兰 发表于 2012-3-4 14:12
我好像弄错了,我混乱了

我觉得你说的挺有道理,对我有所启发。
看一个类的功能还是得从它的方法入手。谢谢了。
作者: 王思兰    时间: 2012-3-4 16:02
钱智慧 发表于 2012-3-4 14:53
我觉得你说的挺有道理,对我有所启发。
看一个类的功能还是得从它的方法入手。谢谢了。 ...

我是看到毕老师视频说,记不清哪个对哪个了,刚刚看了下,是BufferOutputStream中的write(int b)这里是把字符强制转换成字节,保持数据的原样性。
这是API上的原文:OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。

每次调用 write() 方法都会针对给定的字符(或字符集)调用编码转换器。在写入基础输出流之前,得到的这些字节会在缓冲区累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递到此 write() 方法的字符是未缓冲的。

为了达到最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中以避免频繁调用转换器。例如:

Writer out
   = new BufferedWriter(new OutputStreamWriter(System.out));




作者: 种法腾    时间: 2012-3-4 17:12
因为outputstreamWriter是属于Writer体系的,说以操作的是字符,比如,文本(字符串)打印到dos窗口上去,就用到了,该构造方法参数指向目的,所以构造方法的参数是(inputstream的),看方法,应该看参数,,说的通俗一点就是讲字符打碎,变为字节
作者: 钱智慧    时间: 2012-3-4 17:56
种法腾 发表于 2012-3-4 17:12
因为outputstreamWriter是属于Writer体系的,说以操作的是字符,比如,文本(字符串)打印到dos窗口上去, ...

OutputStreamWriter是属于Writer体系不错,问题是它的构造接爱的参数明明就是字节流,兄弟能否用代码解释?编程这玩意儿,有时候越说越糊涂
作者: 钱智慧    时间: 2012-3-4 18:01
陈斌 发表于 2012-3-4 14:33
Writer会一个字节一个字节的把内容写入文件,如果你有丰富编程经验的话,就会知道这种速度会多么慢。而outp ...

你的这段代码,正好让我更加困惑了,这三行代码最终将字节流fos包装(转换)成了字符流bw,跟JDK文档说的正好相反:OutputStreamWriter是节符流通向字节流的桥梁——这句话让我郁闷至极啊
作者: 种法腾    时间: 2012-3-4 18:02
他是输出流,构造方法的参数是目的地 ,而不是你理解的用字节流来,参数指定的是目的,
       
        FileReader fr= new FileReader("a.txt");

        OutputStreamWriter osw = new OutputStreamWriter(System.out);

        需要缓冲高效吗?需要。
        BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));


作者: 黄方    时间: 2012-3-4 18:11
、"是字符流通向字节流的桥梁"这句话就不对,应该是:"是字节流通向字符流的桥梁"
2、BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out),"UTF-8");   
这样试试。
作者: 钱智慧    时间: 2012-3-4 20:08
舞动的心弦 发表于 2012-3-4 18:11
、"是字符流通向字节流的桥梁"这句话就不对,应该是:"是字节流通向字符流的桥梁"
2、BufferedWriter stdout  ...

API文档是这样说的啊,毕老师在讲java基础的时候也是这么说的




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