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 流分为几种?(未完成) 
随机推荐
- SQL 视图(Views)
			SQL 视图(Views) 视图是可视化的表. 本章讲解如何创建.更新和删除视图. SQL CREATE VIEW 语句 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列 ... 
- Hibernate基础-HelloWord
			1. ORM :ORM (Object /Relation Mapping ): 对象/关系映射(理解) 1) ORM 主要解决对象 -关系的映射 2) .ORM的思想:将关系数据 ... 
- DBscan算法及其Python实现
			DBSCAN简介: 1.简介 DBSCAN 算法是一种基于密度的空间聚类算法.该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀值.DBS ... 
- Android数据与服务器交互的GET,POST,HTTPGET,HTTPPOST的使用
			Android有这几种方式,可以提交数据到服务器,他们是怎么使用的呢,这里我们来探讨一下. 这里的例子用的都是提交客户端的用户名及密码,同时本节用到的StreamTools.readInputStre ... 
- [IT学习]Python如何处理异常特殊字符
			欢迎访问www.cnblogs.com/viphhs A byte of Python<输入与输出>一节中有一个处理回文的小例子(io_input.py).作者留了个思考题. 如何将标点去 ... 
- oracle多表关联多字段update
			多表关联多字段update 有代码有J8: update spatial_references set( auth_name, auth_srid, falsex, falsey, xyunits, ... 
- Pulse-code modulation
			脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ... 
- HttpServlet容器响应Web客户流程
			HttpServlet容器响应Web客户请求流程如下: 1)Web客户向Servlet容器发出Http请求: 2)Servlet容器解析Web客户的Http请求: 3)Servlet容器创建一个Htt ... 
- java操作CMD命令
			import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; public class CM ... 
- 替换Android自带apk【转】
			本文转载自:http://www.voidcn.com/article/p-gonowdjh-vz.html 安卓自带的app放在/system/app/下,当我们想要替换这些应用时可以参考如下步骤: ... 
