来自文件 或 网络的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. md5sum使用注意事项

    1. linux 命令行的 md5sum命令 echo -n "123456" | md5sum     //echo的时候, 默认是自带回车的, 必须要去掉 -n 去掉回车. 2 ...

  2. Dom对象的经常用法

    Dom对象的经常用法: (1)getElementById() 查询给定ID属性值的元素,返回该元素的元素节点 1.  查询给定ID属性值的元素,返回该元素的元素节点.也称为元素对象.        ...

  3. CentOS 使用httpd 配置局域网 yum源

    1.上传centos iso而且挂载 mkdir /mnt/cdr/iso mount -o /xxx.iso /mnt/cdr 2.使用createrepo来创建repo文件 cd /mnt/cdr ...

  4. 用户代码未处理 UpdateException

    无法更新 EntitySet"Project_project",由于它有一个 DefiningQuery.而 <ModificationFunctionMapping> ...

  5. vue 配置跨域访问

    主要在config->index.js中配置 proxyTable: { ‘/gameapi’: { changeOrigin: true, // target: ‘http://rap.id. ...

  6. PHP引用是什么?

    引用是什么 在 PHP 中引用意味着用不同的名字访问同一个变量内容.这并不像 C 的指针,替代的是,引用是符号表别名.注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字.最 ...

  7. leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  8. c中的变量

    1 变量类型 1.1 static global or static .data/.bss 1.2 automic stack,its relevant to os kernel and compil ...

  9. mongodb05---游标

    游标cursor: 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取.就像php中的fopen打开文件,得到一个资源一样, 通过资源,可以一行一行的读文件. v ...

  10. UVALive3126 Taxi Cab Scheme —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...