同一Inputstream的父类和子类对象请维持最具体的子类对象,不要混合使用
来源:互联网 发布:知乎 张雪健 编辑:程序博客网 时间:2024/06/08 01:10
1 致谢
2 问题描述
今天在进行进行Android编程 使用来源于同一个网络流的两个InputStream对象
即
private BufferedInputStream bis = null;private InputStream is;……bis = new BufferedInputStream(is);……
在编程时 为了方便
将来源于同一网络流的BufferedInputStream和InputStream交替使用来获取数据
……if (bis.read(buf) != len)……if (!DecUtils.get_one_ADTS_frame(bis, arrayList_AACData)) {……
代码分别如下:
使用BufferedInputStream
/** * 读取2字节数据并转换为int型 * 使用BufferedInputStream * * @return */ private int readInt() { byte[] buf = new byte[2]; int res = 0; try { if (bis.read(buf) != 2) throw new IOException("no more data!!!"); System.out.println("readInt() " +buf[0]+"and"+buf[1]); res = (buf[0] & 0x000000FF) | (((int) buf[1]) << 8); } catch (IOException e) { e.printStackTrace(); } return res; }
使用InputStream
private int readIntTest() { byte[] buf = new byte[2]; int res = 0; try { is.read(buf,0,2); System.out.println("readIntTest() " +buf[0]+"and"+buf[1]); res = (buf[0] & 0x000000FF) | (((int) buf[1]) << 8); } catch (IOException e) { e.printStackTrace(); } return res; }其结果是:
可以发现两个函数的结果是不同的 这实际上是十分奇怪的
因为从逻辑上分析 两种InputStream的read()函数提供的功能是一致的
所以结果应该是相同的
我也写了一段代码进行验证 代码如下
static public void main(String[] args) {// is的测试替换代码 String path = "C:\\Users\\玉成\\Desktop\\2017-12-22-13-39-33-986__8286.3da"; try { InputStream is = new FileInputStream(new File(path)); byte[] buf=new byte[2]; is.read(buf,0,2); System.out.println("readIntTest()"+(short)buf[0]+","+(short)buf[1]); is.close(); is = new FileInputStream(new File(path)); BufferedInputStream bis = new BufferedInputStream(is); bis.read(buf); System.out.println("readInt() " +buf[0]+"and"+buf[1]); bis.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("Hello Java.");}
这也说明了两个InputStream的read()函数提供的功能是一致的
所以肯定是前面的某个地方出现了问题
后来我觉得肯定是由于交替使用两种InputStream的read()函数导致的
3 解决方案
在使用InputStream和其子类对象时 仅维持其最具体的子类对象
以InputStream和BufferedInputStream为例
如果存在类似于继承的关系 如来源于同一数据流 例如 网络流或者文件流
就仅维持其最具体的子类对象 如BufferedInputStream
如果需要使用InputStream作为参数 则直接使用利用BufferedInputStream子类的多态性质即可
在这次编程中 我把is作为了形参
而把BufferedInputStream作为成员变量 于是只维护了这一个具体的子类对象
4 测试
测试成功
阅读全文
0 0
- 同一Inputstream的父类和子类对象请维持最具体的子类对象,不要混合使用
- 类和子类对象的转换
- 父类的引用指向子类对象
- C++ 父类指针指向子类对象||子类指针指向父类对象的理解
- C++ 父类指针指向子类对象||子类指针指向父类对象的理解
- Java基础-父类对象对子类对象的引用
- 多重继承下,不同基类指针指向同一子类对象的地址
- 父类生成的对象和子类生产的对象关系
- 子类继承父类,那么子类实例化时对象调用的是父类还是子类的构造函数?
- 类小结2:子类对象和父类对象的转换 final关键字 抽象类
- [ java ] java语言中的子类对象和父类对象的创建过程!
- 父类的引用指向子类的对象怎么调用子类的方法
- 子类对象的创建过程
- 子类对象内存的问题
- 子类对象的实例化
- 父类引用指向子类对象,为什么会调用的是子类中重新的方法
- 子类继承父类,new 一个子类对象的过程(待完善)
- 子类对象调用父类方法包含子类覆盖的方法
- C#遍历指定文件夹中的所有文件
- USB协议介绍[4]-设备的配置
- ARMCortex系列仿真调试器
- Vulkan加载器接口架构(1)
- bzoj2055 80人环游世界
- 同一Inputstream的父类和子类对象请维持最具体的子类对象,不要混合使用
- USB协议介绍[5]-设备请求
- SQL反模式(三)
- sdut1696
- LeetCode 677. Map Sum Pairs
- tensorflow gpu版本读取cifar10-binary出现类似卡死状态
- Java线程——(2)线程的管理(下)
- 斯坦福大学机器学习作业题Problem Set #1 Regression for denoising quasar spectra 上篇
- <在minecraft中创造一个寻宝游戏>-列表-频率