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 流分为几种?(未完成)
随机推荐
- HTML大文件上传(博客迁移)
Html大文件上传:跳转 通过github和hexo进行搭建博客,主要是在没有网络的时候,可以本地访问,并支持markdown语法. 新博客地址:跳转
- How do you check if a variable is an array in JavaScript? [duplicate]
https://stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript ...
- ubuntu磁盘分区和挂载
- Antivius for Linux
http://www.clamav.net/ https://www.avast.com/zh-cn/linux-server-antivirus http://www.f-prot.com/ ...
- Windows-安装composer
安装laravel之前必须先安装componser,点击:下载Windows安装程序 全部下一步,直到完成 目前,遇到过两个问题(国内防火墙) 还有就是Win10不支持PHP+Composer的组合, ...
- 【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 一 ...
- Apache Hadoop 和Hadoop生态圈
Apache Hadoop 和Hadoop生态圈 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户能够在不了解分布式底层细节的情况下.开发分布式程序.充分利用集群的威力进行快速 ...
- iOS开发——高级篇——Runloop相关一
一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此 ...
- Enterprise Architect 生成项目类图
Enterprise Architect使用教程: https://blog.csdn.net/chenglc1612/article/details/81083151 主要流程 --到此-自动生成完 ...
- JDBC+XML+DOM4J
利用xml文件封装数据库配置信息xml文件放在src目录下/testjdbc1/src/DBUtil.xml <?xml version="1.0" encoding=&qu ...