黑马程序员技术交流社区

标题: [深圳特色][问答网]为什么不能直接用OutputStream输出? [打印本页]

作者: 深圳黑马程序员    时间: 2015-11-29 16:10
标题: [深圳特色][问答网]为什么不能直接用OutputStream输出?
本帖最后由 xiaoqing 于 2015-11-29 16:37 编辑

深圳问答网又按时更新啦。这一期的问题比较奇怪:为什么不能直接用OutputStream来输出数据呢?为什么要由其他的各种子类才能完成输出。继承的子类,其实是对面向对象思想的正确应用哦,千万不要觉得麻烦。下面来看看问答网的回答吧:






学生的问题:

      代码里的底层流可以换成普通流OutputStream吗?若不能,为什么?
  1. public static String decodeStream(InputStream in) throws IOException {
  2.                
  3.                 //底层流
  4.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  5.                
  6.                 int len=0;
  7.                 byte[] buf = new byte[1024];
  8.                 while((len=in.read(buf))>0){
  9.                         baos.write(buf, 0, len);
  10.                 }
  11.                
  12.                 baos.close();
  13.                 //返回 字符 数据
  14.                 return baos.toString();
  15. }
复制代码
       老师回答:
1、不能,因为OutpuStream本身就是个抽象类,最重要的write方法是没有实现的。以下是从源码copy过来的。
  1. /**
  2.      * Writes a single byte to this stream. Only the least significant byte of
  3.      * the integer {@code oneByte} is written to the stream.
  4.      *
  5.      * @param oneByte
  6.      *            the byte to be written.
  7.      * @throws IOException
  8.      *             if an error occurs while writing to this stream.
  9.      */
  10.     public abstract void write(int oneByte) throws IOException;
复制代码

2、ByteArrayOutputStream是OutputStream的子类,它实现了Byte写入。
  1. /**
  2.      * Writes the specified byte {@code oneByte} to the OutputStream. Only the
  3.      * low order byte of {@code oneByte} is written.
  4.      *
  5.      * @param oneByte
  6.      *            the byte to be written.
  7.      */
  8.     @Override
  9.     public synchronized void write(int oneByte) {
  10.         if (count == buf.length) {
  11.             expand(1);
  12.         }
  13.         buf[count++] = (byte) oneByte;
  14.     }
复制代码

3、另外,底层流、普通流这种说法很奇怪,专业领域一般不会这么说。去找工作,这么说会让人觉得莫名其妙。一般都是直接读写英文,学习的时候注意记忆英语单词。


总结一下,就是OutputStream定义了write这些抽象方法,再由具体的子类去实现。这样的继承方式,子类可以关注自己具体的实现,每个

子类都有自己的具体功能。在自己设计API的时候,要正确根据事物的特性来采取不同的面向对象方法。



[深圳特色] 揭秘内部问答网中经典问题,每周更新!
深圳校区除了全国独有问答网,就业老师面试服务,还有更多神秘惊喜等着你,咨询热线:0755-66689855



作者: Weidan    时间: 2015-11-29 22:13
谢谢老师 学习了~
作者: 1018chenhaiyang    时间: 2015-11-30 12:07
谢谢老师
作者: 年强    时间: 2015-11-30 23:04
学到了OutputStream 和 InputStream 应该是类是的
作者: 星晴。    时间: 2015-12-1 22:35
让我又多了层理解
作者: 雨来    时间: 2015-12-3 21:00
问答网不错,因为OutputStream   是一个抽象类,所以要由它的了类具体实现
作者: Id_820    时间: 2015-12-6 21:16
学习了, 求给分呀   
作者: ghb609840612    时间: 2016-1-5 11:39
学习了,谢谢老师




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