Java中的流(5)大数据流的分段读取
来自文件 或 网络的InputStream数据量可能很大,如果用流的大小申请byte[],可能内存不足报错。
解决方案:分段读取
InputStream的方法int available()返回本次可读取的流的大小。如果可读大小大于缓冲大小,那么每次只读缓冲大小的数据,读n次后再读余下的
,如果可读数小于缓冲大小,那么读全部可读大小。
如:
public static final int MAX_BUFFER = *;//512k,可以调小,太大会内存不足
void save_to_file(InputStream is, long fileSize) throws IOException {
File file = new File(Downloader.FILE_PATH, mFileName);
FileOutputStream fos = new FileOutputStream(file, true);
long sz = ;
byte buffer[] = new byte[Downloader.MAX_BUFFER];
while (sz < fileSize && networkConnected) {//当读取总数小于fileSize且有网络连接
int available = is.available();//可以读出的数据大小。
if (available > Downloader.MAX_BUFFER ) {//如果可读大小大于缓冲大小,那么每次只读缓冲大小的数据,读n次后再读余下的。
int cx = available / Downloader.MAX_BUFFER;
int readed = ;
for (int i = ; i < cx; i++) {
readed = is.read(buffer, , Downloader.MAX_BUFFER );
sz += readed;
fos.write(buffer, , Downloader.MAX_BUFFER );
fos.flush();
publishProgress(sz * / fileSize);
}
readed = is.read(buffer,,available - cx * Downloader.MAX_BUFFER);
sz += readed;
fos.write(buffer, , readed);
fos.flush();
publishProgress(sz * / fileSize);
System.out.println("available = " + available + " readed = " + readed);
}else{
//如果可读数小于缓冲大小,那么读全部可读大小。
int readed = is.read(buffer, , available);
System.out.println("available = " + available + " readed = " + readed);
sz += readed;
fos.write(buffer, , available);
fos.flush();
publishProgress(sz * / fileSize);
}
}
fos.close();
/*
* File file = new File(mFilePath,mFileName); FileOutputStream fos = new
* FileOutputStream(file,true);
*
* int available = -1; long sz = 0; while (sz < fileSize ) { available =
* is.available(); byte data[] = new byte[available];//产生大量内存泄漏 sz +=
* is.read(data); fos.write(data); fos.flush(); publishProgress(sz *
* 100/fileSize ); } fos.close(); System.gc();
*/
Java中的流(5)大数据流的分段读取的更多相关文章
- Java中的流(1)流简介
简介 1.在java中stream代表一种数据流(源),java.io的底层数据元.(比作成水管)2.InputStream 比作进水管,水从里面流向你,你要接收,read3.OutputStream ...
- 理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- 理解Java中字符流与字节流
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...
- 理解Java中字符流与字节流的区别(转)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Java中对象流使用的一个注意事项
再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...
- java 中 IO 流分为几种?(未完成)
java 中 IO 流分为几种?(未完成)
随机推荐
- javascript array-like object
http://www.nfriedly.com/techblog/2009/06/advanced-javascript-objects-arrays-and-array-like-objects/ ...
- [Angular] Expose Angular Component Logic Using State Reducers
A component author has no way of knowing which state changes a consumer will want to override, but s ...
- unity3d 摄像机抖动特效
摄像机抖动特效 在须要的地方调用CameraShake.Shake()方法就能够
- 9款Android经常使用的高速开发框架
1.Afinal框架 项目地址:https://github.com/yangfuhai/afinal 项目地址:http://www.oschina.net/p/afinal 主要有四大模块: ( ...
- BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度
题目大意:给定一棵n个节点的树的节点的度数.当中一些度数无限制,求能够生成多少种树 Prufer序列 把一棵树进行下面操作: 1.找到编号最小的叶节点.删除这个节点,然后与这个叶节点相连的点计入序列 ...
- vmware10上安装mac os 10.9
来源地址:http://dtbuluo.com/blog/archives/350 序言: 前几天跟朋友开玩笑说,要不我们一起来学习一下swift编程语言吧~我们就抱着玩玩的态度,没有想过要做出什么优 ...
- [办公自动化]计算机突然断电,微软office文档(有asd文件)如何恢复?
今天同事使用office软件时,突然故障.结果他忙了半天的word文档内容都找不见了. 经过查找,在其硬盘根目录找到了asd文档. 但是用当前版本的word和高版本的word软件都无法打开. 又查找了 ...
- Setting Up FastCGI Proxying
http://nginx.org/en/docs/beginners_guide.html
- mysql15--垂直分表水平分表
分表技术(表的结构不能变) 分表技术有(水平分割和垂直分割) 当一张越来越大时候,即使添加索引还慢的话,我们可以使用分表 以qq用户表来具体的说明一下分表的操作. 思路如图 : 首先我创建三张表 u ...
- YTU 2416: C语言习题 成绩输出
2416: C语言习题 成绩输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 1111 解决: 417 题目描述 输入n(<=10)个学生的姓名.学号和成绩,将其中不及格者的姓 ...