android 多线程下载文件大小不对的问题

专门处理文件的类------RandomAccessFile类 Java除了File类之外,还提供了专门处理文件的类,即RandomAccessFile(随机访问文件)类。该类是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile类支持“随机访问”方式,这里“随机”是指可以跳转到文件的任意位置处读写数据。在访问一个文件的时候,不必把文件从头读到尾,而是希望像访问一个数据库一样“随心所欲”地访问一个文件的某个部分,... 阅读详情


转发请注明原文出处:http://blog.youkuaiyun.com/anyfive/article/details/45024221


在多线程下载中,会出现下载的文件(音乐、图片)偏大或偏小。音乐文件可以正常播放,但不是按顺序播放,会发现播放起来里面的内容不是流畅的,可能有几段是重复的;图片也能显示,但不是正常图片,某些部分会重复,且像几个大碎片无序拼在一起的图像。

遇到这种问题,网络上有几种说法:

1、使用XX.write(buffer,0,lenght)函数代替XX.write(buffer);

2、HttpURLConnection服务器交互采用gzip压缩,所以获取得长度不对,所以要在http request的head中设置取消压缩方式:

urlConnection.setRequestProperty(“Accept-Encoding”,”identity”);

而当你尝试这两种方式,发现下载的文件还是不正确时,你就要考虑每个线程下载的开始位置是否正确了。通过查看代码,发现InputStream.skip(long n)方法其实是有问题的,这个方法的返回值为“实际跳过的长度”,什么意思呢?就是说当你使用这个函数时,实际跳过的长度可能小于n。在API文档中也有关于这个函数的说明。

其实要解决这个问题非常简单,只要将实际跳过的长度与n做比较,若小,则继续跳过(n-实际跳过的长度),每次循环中都更新实际跳过的长度,便可解决了。例如:

int a = inputStream.skip(long n);
while(a<n)
{
a += inputStream.skip(n-a);
}





Android多线程断点续传下载原理及实现 这段时间看了看工作室的工具库的下载组件,发现其存在一些问题: 1.下载核心逻辑有 bug,在暂停下载或下载失败等情况时有概率无法顺利完成下载。 2.虽然原来的设计是采用多线程断点续传的设计,但打了一下日志发现其实下载任务都是在同一个线程下串行执行,并没有起到加快下载速度的作用。 考虑到原来的代码并不复杂,因此对这部分下载组件进行了重写。这里记录一下里面的多线程断点续传功能的实现。 更多完整项... 阅读详情

相关推荐

Android FileDownloader框架多线程下载

在android 多线程下载框架中, FileDownloader开源库是个比较好的下载库非常方便快捷 地址如下: [https://github.com/lingochamp/FileDownloader](https://github.com/lingochamp/FileDownloader) 特点 简单易用 单任务多线程/多连接/分块下载(并支持通过ConnectionCountAdap...

安卓兼职framework和app工程师的博客 2073

Android面试:大厂必问之OkHttp相关问题全解析【建议收藏】(1)

*一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

2301_82244623的博客 402

android断点下载之多线程分段下载进阶

下载的接口 public interface RetrofitService { @GET("https://www.wandoujia.com/apps/604363/download/dot?ch=detail_normal_dl") Call<ResponseBody> breadPointRetrofit(@Header("range") String r...

weixin_45365889的博客 882

Android显示从网络下载图片偏小的问题

在从网络上下载图片时发现图片偏小,原来以为是BitmapFactory.decodeStream时BitmapFactory.Options的选择问题,但是试过了很多方法,达不到理想效果,后来发现是BitmapDrawable的使用问题,使用了BitmapDrawable(Bitmap bitmap)的构造方法,其实应该使用的是BitmapDrawable(Resources res, Bitmap

寒江蓑笠的专栏 1419

利用python语言进行相机标定

利用python语言进行相机标定 目录利用python语言进行相机标定一、相机标定相关原理1.相机标定简介2.坐标映射2.1图像坐标系1)图像坐标系(Pixel coordinate system)2)成像平面坐标系(Retinal coordinate system)3)摄像机坐标系(Camera coordinate system)4)世界坐标系(World coordinate system)二、相机标定算法流程1.镜头畸变1.1径向畸变1.2切向畸变2.相机标定算法求解外参内参和单应矩阵关系求解(张

qq_44818951的博客 4700

Codesys电子凸轮功能块MC_CamIn的masteroffset和slaveoffset参数的使用

问题1:在Codesys使用作轴电子凸轮时,MC_CamTableSelect的参数设置为MasterAbsolute=1,SlaveAbsolute=1,此设置为绝得模式, 此时主从轴当前位置都不为零时,此时Masteroffset=0、slaveOffset=0,凸轮启时出现突变,实轴无法启动。问题分析:在觉得模式下,主轴位置和从轴为是对应凸轮表的相位的,Masteroffset=0、slaveOffset=0,启动点时在主轴位置=0,从轴位置=0的点启动,此时主轴当前位置不为零则主从轴位置发生突变,

weixin_43587371的博客 1801

URLConnection下载文件时文件长度-1问题

在开发过程中一定会遇见这样的需求,从服务端下载一个文件,例如安装包等,在下载文件的过程中,一般会有进度条来显示加载进度。这时就会使用到文件总大小这个值了。 通过 urlConnection.getContentLength(); 方法得到的值为-1,这是什么原因呢,因为默认情况下,URLConnection会采用gzip的格式来接收文件流,所以得不到正确的值。 可以使用如下的方式来获取: url...

Alex Zhang的专栏 2200

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

安卓M3U8多线程批量下载神器

本文详细介绍安卓M3U8多线程批量下载神器的核心功能与使用技巧。该工具针对M3U8视频格式深度优化,支持智能断点续传、多线程加速和批量下载管理,大幅提升下载效率和稳定性,是教育学习、媒体素材收集和个人娱乐的得力助手。

d6e7f8的博客 1051

Halcon dyn_threshold详解

dyn_threshold 原型 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 功能 利用局部阈值分割图像 参数列表 OrigImage (input_object):原始图像 ThresholdImage (input_object):处理后图像(一般采用滤波处理) RegionDynThresh (output_object):分割后区域 Offset (input_control):灰

ZiLiangQin的博客 1万+

BK7238(XH-WB3S)固件烧录实战:从AT固件选择到稳定下载全解析

本文详细解析了BK7238(XH-WB3S)模组固件烧录的全过程,从AT固件版本选择到稳定下载的实战技巧。重点介绍了烧录前的准备工作、硬件连接的正确姿势、烧录软件的实战技巧以及疑难问题排查指南,帮助开发者高效完成BK7238模组的固件烧录。

weixin_29159441的博客 253

Java / Android 基于Http的多线程下载的实现

有个朋友需要个多线程现在的例子,就帮忙实现了,在此分享下~ 先说下原理,原理明白了,其实很简单: a、对于网络上的一个资源,首先发送一个请求,从返回的Content-Length中回去需要下载文件的大小,然后根据文件大小创建一个文件。 this.fileSize = conn.getContentLength();// 根据响应获取文件大小 File dir = new File(dirSt

Hongyang 2万+

使用 STM32F7 和 TensorFlow Lite 开发低功耗人脸识别设备

我们讨论了 STM32F7 的特点和能力,TensorFlow Lite 在 STM32F7 上的应用,以及一些降低功耗的优化技术。- 准备模型:选择合适的人脸识别模型,在 TensorFlow 中进行训练和导出,并使用 TensorFlow Lite 转换为适用于 STM32F7 的量化模型。请注意,上述代码仅展示了如何加载和运行 TensorFlow Lite 模型的方法,实际应用中需要集成人脸检测和识别模型,并根据实际需求进行相应的输入和输出处理。结合这两个工具,我们可以开发出低功耗的人脸识别设备。

weixin_66608063的博客 2587

安卓多线程下载文件(二)

本文继续探讨安卓多线程下载文件的实现,重点介绍了下载信息分配任务类的设计。首先,通过URL获取被下载文件的总长度,并设计了暂停和取消下载的标记。为了实时更新下载进度,使用Handler发送进度信息,并通过所有线程已下载的字节数之和除以文件总长度来计算总进度。此外,根据URL查询数据库,实现断点续下载功能。当点击暂停按钮时,更新数据库中的相关记录。文章还提供了FromZeroDownloadTask类的部分代码,展示了如何初始化下载任务、获取文件长度、处理多线程下载等关键步骤。

csdn_too的博客 693

钉钉多维表格开发

从0到1完成钉钉多维表格开发SDK对接与实践案例。

沉修所长,勇逐新机;安而不怠,静而思变 3631

手把手保姆级|Python爬取微信公众号文章完整版,反反爬策略拉满,附可运行完整代码(永久可用)

做Python爬虫的朋友都知道,爬取微信公众号文章 绝对是爬虫领域的「香饽饽」也是「硬骨头」。一方面,微信公众号的文章是极具价值的数据源:不管是自媒体从业者做竞品分析、新媒体运营者整理干货、还是个人学习收集资料,都需要批量爬取公众号文章;另一方面,微信的反爬机制堪称全网最严苛之一 ——腾讯对微信生态的风控做到了极致,动态渲染页面、高频IP封禁、Cookie短时效失效、请求头严格校验、自动化工具秒识别、频繁请求直接拉黑,这些反爬手段让90%的爬虫新手望而却步:要么爬了几篇就被封IP,要么Cookie失效爬取中

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2628

日常开发——Android多线程下载

在项目中学习到安卓一个基本的多线程下载实现,本文总结一下实现步骤以及基本的原理。 一、应当创建一个继承线程(Thread)的多线程下载类,在这个类内部管理关于下载的数据(更新UI,计算网速,计算已下载量与剩余时间等)。以下讲一下重写的run()方法大概流程: 1.声明多个下载线程(真正执行下载的线程,需要自己实现,后面会讲)。注意只是声明,并未分配内存; 2.创建一个url,这时创建的url

Jeffery_Gong的博客 727

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android 多线程下载

多线程下载网上有很多的例子,其中需要注意的就是: 每个线程该分配多大的算法; 通过请求从返回的 getContentLength() 方法获取需要下载的文件大小。 使用 RandomAccessFile 类来创建文件夹。因为该类可以从文件的任何位置开始读写操作,有 seek() 方法。 下载成功后的示意图: 具体代码如下: MultiThreadDownload.j

antimage08的博客 666

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android文件下载——多线程下载

为了实现多线程下载,我们需要使用下面几个部分的知识来实现: 1. 相关逻辑 1.1 HTTP首部信息 HTTP请求头部字段Range,可以用来标识当前请求所请求的这个文件的数据范围,这个范围是byte类型的范围,比如: connection = (HttpURLConnection) url_c.openConnection(); ... connection.setRequestProperty("Range", "bytes=" + startPos +"-" + endPos); 这样就可以在下载一

梦否 2985

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

第11天-安卓多线程下载

今天来记录一下安卓的多线程下载。 先来说一下整体的一个思路:因为是要去下载目标文件,那么我们就需要先使用目标下载url来获得目标文件的大小,以及文件名(以便在本地创建该文件名)。然后开始创建线程,创建线程使用for循环,相信大家都懂。对于创建的线程,我们可以写具体的方法,来实现相应的下载任务。 首先创建一个emptyAvtivity。 由于初学者对多线程机制不了解,所以不推荐直接在项目中写代码。在...

weixin_43460088的博客 243

Android【封装】多线程下载以及断点续传

多线程下载,以及断点续传 效果图 多线程下载的原理 需要解决的几个问题 理清思路 简单封装核心代码 使用方法 源码下载地址 1.效果图2.多线程下载的原理通常服务器同时与多个用户连接,用户之间共享带宽。如果N个用户的优先级都相同,那么每个用户连接到该服务器上的实际带宽就是服务器带宽的N分之一。可以想象,如果用户数目较多,则每个用户只能占有可怜的一点带宽,下载将会是个漫长的过程。 假设服务器的带

小贱人_001的博客 709

android --多线程下载

多线程下载文件的过程是:    (1)首先获得下载文件的长度,然后设置本地文件的长度。       HttpURLConnection.getContentLength();//获取下载文件的长度      RandomAccessFile file = new RandomAccessFile("QQSetup.exe","rwd");     

超宇的博客 4213

android多线程下载解析,详解Android中的多线程断点下载

首先来看一下多线程下载的原理。多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序“拼接”起来就构成了完整的文件了。这样就大大提高了文件的下载效率。对于文件下载来说,多线程下载是必须要考虑的环节。多线程下载大致可分为以下几个步骤:一.获取服务器上的目标文件的大小显然这一步是需要先访问一下网络,只需要获取到目标文件的...

weixin_42109925的博客 365

Android 多线程断点下载

QDownload QDownload是基于Android平台实现的下载框架。API简洁易上手,只需5分钟即可实现一个多任务、多线程、断点下载的功能 支持功能如下: 支持多个下载任务同时下载 单个任务支持开多个线程下载 支持断点下载,在断网、进程被划掉可恢复下载 自动校验服务器文件服务器是否支持断点下载,如果不支持则会开启单线程任务下载 支持应用全局监听下载进度回调 支持下载速度显示 支持添加下载任务,暂停下载,恢复下载,取消下载 支持批量暂停,批量恢复下载 先贴个效果图 主页 多任务多线程断点下载页

越努力越幸运 3347

Android 单线程下载与多线程下载

一、搭建severlet服务器 上面的图片展示的只是我们在搭建好服务器的情况下,新建一个Serverlet的方式。具体的从头开始搭建Serverlet的方式大家可以查看下面的连接。 Serverlet具体的搭建方法 注:如果之前已经搭建好的服务器,但是现在不能用了,出现404 错误的,可以参考以上代码重新搭建一遍就能用了。 二、单线程下载   单线程的下载思想就是通过URL来连接We

danfengw的博客 2562
上一篇: Android RadioGroup+ViewPager+ActionBar实现仿微信6.0界面(底部滑动菜单栏+导航栏)
下一篇: android 数据库(sqlite)查询去除重复值
Jimi_Wu
博客等级 码龄12年 40粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值