黑马程序员技术交流社区

标题: 关于ByteArrayInputStream的问题。谢谢! [打印本页]

作者: 刘宁    时间: 2012-3-26 16:50
标题: 关于ByteArrayInputStream的问题。谢谢!
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()?
作者: 李涛涛    时间: 2012-3-26 17:37
toString(),使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串.而bos现缓冲区里的内容就是字符。bos不是字节,bos在调用write()这个方法时,是将指定的字节写入字节数组。等循环完成后,bos里面是一个byte数组。println(Object o)在调用时,会先调用String.valueOf(o)获取打印的对象的字符串值,然后先调用println(String)再调用print().所以你打印出来的bos是字符串。
毕老师写bos.toString()先将bos对象转换成字符串,在进行打印。就是直接调println(String)方法,提高了程序的效率。
作者: 刘宁    时间: 2012-3-27 00:54
李涛涛 发表于 2012-3-26 17:37
toString(),使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串.而bos现缓冲区里的内容就是字符 ...

谢谢 高手啊 这点一直想不懂
作者: 李涛涛    时间: 2012-3-27 09:30
刘宁 发表于 2012-3-27 00:54
谢谢 高手啊 这点一直想不懂

不好意思呀,少打字了,bos现缓冲区里的内容是字节数组
作者: yangshang1    时间: 2012-3-27 12:26
首先我们看看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();
    }
这就明白吧






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