来自文件 或 网络的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)大数据流的分段读取的更多相关文章

  1. Java中的流(1)流简介

    简介 1.在java中stream代表一种数据流(源),java.io的底层数据元.(比作成水管)2.InputStream 比作进水管,水从里面流向你,你要接收,read3.OutputStream ...

  2. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  3. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  4. java中有关流操作的类和接口

    一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...

  5. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  6. 理解Java中字符流与字节流

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  7. 理解Java中字符流与字节流的区别(转)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  8. Java中对象流使用的一个注意事项

    再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...

  9. java 中 IO 流分为几种?(未完成)

    java 中 IO 流分为几种?(未完成)

随机推荐

  1. SQL 视图(Views)

    SQL 视图(Views) 视图是可视化的表. 本章讲解如何创建.更新和删除视图. SQL CREATE VIEW 语句 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列 ...

  2. Hibernate基础-HelloWord

    1. ORM :ORM (Object /Relation Mapping ): 对象/关系映射(理解)      1) ORM 主要解决对象 -关系的映射      2) .ORM的思想:将关系数据 ...

  3. DBscan算法及其Python实现

    DBSCAN简介: 1.简介 DBSCAN 算法是一种基于密度的空间聚类算法.该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀值.DBS ...

  4. Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用

    Android有这几种方式,可以提交数据到服务器,他们是怎么使用的呢,这里我们来探讨一下. 这里的例子用的都是提交客户端的用户名及密码,同时本节用到的StreamTools.readInputStre ...

  5. [IT学习]Python如何处理异常特殊字符

    欢迎访问www.cnblogs.com/viphhs A byte of Python<输入与输出>一节中有一个处理回文的小例子(io_input.py).作者留了个思考题. 如何将标点去 ...

  6. oracle多表关联多字段update

    多表关联多字段update 有代码有J8: update spatial_references set( auth_name, auth_srid, falsex, falsey, xyunits, ...

  7. Pulse-code modulation

    脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ...

  8. HttpServlet容器响应Web客户流程

    HttpServlet容器响应Web客户请求流程如下: 1)Web客户向Servlet容器发出Http请求: 2)Servlet容器解析Web客户的Http请求: 3)Servlet容器创建一个Htt ...

  9. java操作CMD命令

    import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; public class CM ...

  10. 替换Android自带apk【转】

    本文转载自:http://www.voidcn.com/article/p-gonowdjh-vz.html 安卓自带的app放在/system/app/下,当我们想要替换这些应用时可以参考如下步骤: ...