输入流重复读取问题,解决InputStream引发的空指针问题
来源:互联网 发布:手机淘宝安全中心在哪 编辑:程序博客网 时间:2024/05/16 04:43
- 写安卓demo小程序,通过HttpClient获取了json文件,首先通过HttpResponse转换json为List,然后用同一个HttpResponse获取的输入流将json数据写入SdCard,然后程序一直异常,学安卓并不久,调试不太精通,废了很大功夫,发现了这个问题。
- 总结:同一个输入流只能读取一次,虽然以前使用socket编程时知道这个问题但是不小心还是会忘记。每次从输入流读取了数据之后,输入流中的这些数据就无法读取了,就好比真正的水管一样,水流出来就真的不在水管中了。在文件流读取完之后数据引用会定位到输入流数据末端,无法再用该输入流读取读取过的数据。若用read()方法则返回-1,若要重新读取,则要用到mark和reset方法。这两个方法只适用于BufferedInputStream,InputStream 的 mark 方法不执行任何操作。 ,因为缓冲流会在本地内存缓存数据,它就可以延长缓存数据的生存时间,达到二次读取的效果。
- public void mark(int readlimit)
- 在此输入流中标记当前的位置。对 reset 方法的后续调用会在最后标记的位置重新定位此流,以便后续读取前面读取过的的字节。
- readlimit 参数为从mark标记开始允许读取的字节数。
- mark 的常规协定是:如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节,并时刻准备在调用方法 reset 时,再次提供这些相同的字节。如果在mark之后读取的数据的大小大于readlimit和BufferedInputStream类的缓冲区大小两者中的最大值则mark标记无效。
- 如果要重复读取的数据量比较小,可以尝试使用BufferedInputStream的mark/reset方法。
如果重复读取的数据量比较大,不适用同一个缓冲区的重复使用,那么,重复创建相应的输入流对象。
- 注意:mark和reset方法只能在BufferedInputStream中使用,BufferedInputStream类调用mark(int readlimit)方法后读取多少字节标记才失效,是取readlimit和BufferedInputStream类的缓冲区大小两者中的最大值,而并非完全由readlimit确定。
0 0
- 输入流重复读取问题,解决InputStream引发的空指针问题
- 指针引发的问题(以解决)
- 一起空指针引发的程序问题的排查过程
- 关于ButterKnife8.4引发的空指针问题。。。
- 解决iOS空指针数据的问题
- 解决一个冷门的空指针问题
- 解决iOS空指针数据的问题
- InputStream读取数据问题
- InputStream读取数据问题
- 有关inputstream流只能读取一次的问题
- 重复读取InputStream的方法
- 重复读取InputStream的方法
- 解决this.getHibernateTemplate()的空指针异常的问题
- 解决singleinstance引发的问题
- 解决InputStream中数据读取不完整问题
- InputStream按指定编码读取解决乱码问题
- 解决在使用request得到属性的空指针问题
- JPQL里解决SUM会返回空指针的问题
- shell排序
- SQL
- PHP中对String进行操作的函数总结
- java 斐波那契数列
- 基于SystemBarTint快速打造沉浸式状态栏
- 输入流重复读取问题,解决InputStream引发的空指针问题
- 前端学习总结(六)Bootstrap
- Spring tool suite 快速创建Spring MVC 项目
- HDU 2547 无剑无我 (大水题)
- Git教程总结
- 基础母函数模版
- 前端学习总结(七)Angular.js——以数据交互为核心的前端框架
- hdoj--5100--Chessboard(数学推理)
- 前端学习总结(八)NodeJS——前端工程师通向后端的里程碑