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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘宁 中级黑马   /  2012-3-26 16:50  /  2294 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class ByteArrayStream
{
        public static void main(String[] args)
        {
                ByteArrayInputStream bis = new ByteArrayInputStream("美女".getBytes());
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
       
                int by = 0;
                while ((by = bis.read())!=-1)
                {
                        bos.write(by);
                       
                }       
                System.out.println(bos);
                System.out.println(bos.toString());
        }
}
在这个程序中 有几个问题:
第一:为什么我打印bos 和 bos.toString()出来的结果都是一样的  都是字符串?bos不应该是字节吗?
第二:他们俩有区别吗?为什么毕老师用的是 bos.toString()?

4 个回复

倒序浏览
toString(),使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串.而bos现缓冲区里的内容就是字符。bos不是字节,bos在调用write()这个方法时,是将指定的字节写入字节数组。等循环完成后,bos里面是一个byte数组。println(Object o)在调用时,会先调用String.valueOf(o)获取打印的对象的字符串值,然后先调用println(String)再调用print().所以你打印出来的bos是字符串。
毕老师写bos.toString()先将bos对象转换成字符串,在进行打印。就是直接调println(String)方法,提高了程序的效率。
回复 使用道具 举报
李涛涛 发表于 2012-3-26 17:37
toString(),使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串.而bos现缓冲区里的内容就是字符 ...

谢谢 高手啊 这点一直想不懂
回复 使用道具 举报
刘宁 发表于 2012-3-27 00:54
谢谢 高手啊 这点一直想不懂

不好意思呀,少打字了,bos现缓冲区里的内容是字节数组
回复 使用道具 举报
首先我们看看System.out.println(bos);
public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
如果这还不明白那我们看看
String.valueOf(x)的源码
public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
这就明白吧

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