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 流分为几种?(未完成)
随机推荐
- 对dispatch_async到主线程的逻辑封装成C/C++接口类型
背景:代码里面有时候会把将要运行的内容放到主线程里面运行,但假设已经是主线程里面的代码调用dispatch_async的时候偶尔会出现crash,所以就须要推断是否已经在主线程里面了. 通常的做法类似 ...
- 什么是WPF? 秒懂 !
一開始听到WPF.认为非常陌生.在百度百科等地方看完简单介绍之后.感觉更深奥.各种不懂啊! 在简单做了几个页面之后,发现.原来如此! So Easy 但又So Magic. 为什么说它简单?由于它简直 ...
- Office Adobe Acrobat把PDF转换为Word时候提示不支持的Type2字体怎么办
如下图所示,在使用Adobe Acrobat Pro9将PDF转换为Word的时候出现下面的错误 很简单,不要用Adobe Acrobat Pro9了,用Adobe Acrobat Pro X,还 ...
- VC++如何折叠代码
工具-选项,然后在文本编辑器,C/C++中的格式设置,把大纲语句块设置为True 这样之后,还是不能像C#一样使用region折叠代码,但是可以方法和if语句都会自动显示可以折叠. 使用#pr ...
- Leetcode--easy系列10
#205 Isomorphic Strings Given two strings s and t, determine if they are isomorphic. Two strings are ...
- hdu 1879 继续畅通project
本题链接:pid=1879http://">点击打开链接 本题大意: 输入n行数据.每行数据前两个表示该条路连通的两个村庄的编号,第三个表示修该条路的成本.最后的0或1表示该路未修或已 ...
- 解决Install failed uid changed
出现此问题的原因大多是apk冲突造成,解决的办法如下: 将apk相关文件和相关内容删除 (1) 将手机root,Window上装root大师等工具root成功率较高 (2) 删除可能相关的文件:/da ...
- C项目实践--图书管理系统(4)
前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...
- MVC框架显示层——Velocity技术
Velocity,名称字面翻译为:速度.速率.迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts(Taglib和Tiles)是如何联系?在技 ...
- YTU 2982: 奔跑吧,小明!
2982: 奔跑吧,小明! 时间限制: 1 Sec 内存限制: 128 MB 提交: 36 解决: 2 题目描述 小明陷入一个充满陷阱的密道之中,现在他要逃脱这里!到达密道的出口即可离开这处绝境! ...