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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钱智慧 中级黑马   /  2012-3-4 11:09  /  3074 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

JDK文档说OutputStreamWriter是字符流通向字节流的桥梁,可为何它的构造参数传递进来的却是字节流对象?
它是如何将字符流转为字节流的?有高人可否为小弟举个例子么?

16 个回复

倒序浏览
这个就是字节流转成字符流,API上介绍就是“字符流通向字节流的桥梁”,但在实际应用中却是字节流到字符流,你找份原版的API看看吧

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
OutputStreamWriter 是指将字节流转换为字符流,反之则抱歉,没有。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
杨盼 发表于 2012-3-4 11:31
这个就是字节流转成字符流,API上介绍就是“字符流通向字节流的桥梁”,但在实际应用中却是字节流到字符流 ...

您的意思就是中文的JDK说法有误了?

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 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();

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
InputStreamReader是字节流通向字符流的桥梁,read方法会把一个字节转换成4个位的int类型,相对应的OutputStreamWriter的write(int c)方法则会把字符强制转换为字节,所以OutputStreamWriter是字符流通向字节流的桥梁

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
我好像弄错了,我混乱了
回复 使用道具 举报
钱智慧 发表于 2012-3-4 12:04
您的意思就是中文的JDK说法有误了?

看帮助文档一般都要看原版的,翻译的出错也不是不可能啊
回复 使用道具 举报
Writer会一个字节一个字节的把内容写入文件,如果你有丰富编程经验的话,就会知道这种速度会多么慢。而outputstreamwriter是带有缓存的,用它包装了writer之后,writer就不会直接往文件中写,而是交给outputstreamwriter,然后就会往缓存中写,待Writer操作完成,OutputStreamWriter再一次性写入文件,效率大大提升。
例子:
  FileOutputStream fos=new FileOutputStream("file.txt");
                OutputStreamWriter osw=new OutputStreamWriter(fos);
                BufferedWriter bw=new BufferedWriter(osw);

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
王思兰 发表于 2012-3-4 14:12
我好像弄错了,我混乱了

我觉得你说的挺有道理,对我有所启发。
看一个类的功能还是得从它的方法入手。谢谢了。
回复 使用道具 举报
钱智慧 发表于 2012-3-4 14:53
我觉得你说的挺有道理,对我有所启发。
看一个类的功能还是得从它的方法入手。谢谢了。 ...

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

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

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

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



评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
因为outputstreamWriter是属于Writer体系的,说以操作的是字符,比如,文本(字符串)打印到dos窗口上去,就用到了,该构造方法参数指向目的,所以构造方法的参数是(inputstream的),看方法,应该看参数,,说的通俗一点就是讲字符打碎,变为字节

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
种法腾 发表于 2012-3-4 17:12
因为outputstreamWriter是属于Writer体系的,说以操作的是字符,比如,文本(字符串)打印到dos窗口上去, ...

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

你的这段代码,正好让我更加困惑了,这三行代码最终将字节流fos包装(转换)成了字符流bw,跟JDK文档说的正好相反:OutputStreamWriter是节符流通向字节流的桥梁——这句话让我郁闷至极啊
回复 使用道具 举报
他是输出流,构造方法的参数是目的地 ,而不是你理解的用字节流来,参数指定的是目的,
       
        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));

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 加分加得我手痛。

查看全部评分

回复 使用道具 举报
、"是字符流通向字节流的桥梁"这句话就不对,应该是:"是字节流通向字符流的桥梁"
2、BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out),"UTF-8");   
这样试试。
回复 使用道具 举报
舞动的心弦 发表于 2012-3-4 18:11
、"是字符流通向字节流的桥梁"这句话就不对,应该是:"是字节流通向字符流的桥梁"
2、BufferedWriter stdout  ...

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

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马