Android 多线程下载网络文件

Android 多线程下载网络文件

这里需要用到一个类RandomAccessFile,下面是JDK里面对此类的描述!

此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。

通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。 

该类有两个构造方法RandomAccessFile(File file/String name,String mode);

其中Mode如下表

r 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
rw 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件
rws 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备
rwd 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备

 


 

下面是一个实例:

 

public class MulThreadDownLoad {
    public static void main(String[] args) {
        String path = "http://localhost:4484/WebSite1/21.bmp";// 一个本地web服务,指向一张图片
        try {
            new MulThreadDownLoad().download(path, 3);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void download(String path, int threadsize) throws Exception {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if (conn.getResponseCode() == 200) {
            int length = conn.getContentLength();
            File file = new File(getFilename(path));
            RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
            // 在本地生成一个长度为length的文件
            accessFile.setLength(length);
            accessFile.close();
            // 每条线程负责下载的数据量
            int block = length / threadsize == 0 ? length / threadsize : length / threadsize + 1;
            for (int threadid = 0; threadid < threadsize; threadid++) {
                new Thread(new Runa(threadid, block, url, file)).start();
            }
        } else
            System.out.println(conn.getResponseCode() + "");
    }

    private class Runa implements Runnable {
        private int threadid;
        private int block;
        private URL url;
        private File file;

        public Runa(int threadid, int block, URL url, File file) {
            this.threadid = threadid;
            this.block = block;
            this.url = url;
            this.file = file;
        }

        @Override
        public void run() {
            int start = threadid * block;// 计算该线程从网络文件的什么位置开始下载
            int end = (threadid + 1) * block - 1;// 计算该线程下载网络文件的结束位置
            try {
                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");// 创建从中读取和向其中写入(可选)的随机访问文件流
                accessFile.seek(start);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Range", "bytes=" + start + "-" + end);// 设置从start开始下载,到end结束
                // if (conn.getResponseCode() == 200) {
    // 如果是分段下载,请求状态码不是200而是206!
                InputStream ins = conn.getInputStream();
                byte[] buffer = new byte[1024];
                int length = 0;
                while ((length = ins.read(buffer)) != -1) {
                    accessFile.write(buffer, 0, length);
                }
                accessFile.close();
                ins.close();
                // }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
    private String getFilename(String path) {
        return path.substring(path.lastIndexOf("/") + 1);
    }
}

 下面是多线程下载原理图

Android 多线程下载网络文件

Android和JavaEE中,多线程下载原理相同。

转载于:https://www.cnblogs.com/a284628487/archive/2013/04/20/3033175.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110156.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android中联系人使用

    我8月份的时候接触过联系人这里,看了很多文章,把我弄蒙了,今天突然发现这篇文章,不错,如果我以后涉及到这方面的业务,会多来学习下,作者博客地址和英文原文地址都放在最下面了。前阵子搞短信,发现Android1.x至2.0版本联系人数据库很多地方做了更改,且关于这方面的资料也比较少,所以找到一篇文章稍作翻译了下,以供大家参考,该文将分三部分发布。WorkingWithAndro

    2022年4月8日
    41
  • 利用Python制作微信机器人(一)

    利用Python制作微信机器人(一)双十一时候,阿里云服务器打折。于是直接买了三年的阿里云服务器。自己也明白有一个云服务器说白了就是有一个公网IP+7*24h不关机的电脑。但买完服务器后,就不知道用这服务器来做点什么炫酷的事情了。这两天看到有某位海王做了个自动回复消息的机器人来给女朋友们回消息,是否可以用这个服务器来做一个自动回复消息的机器人。…

    2022年6月23日
    27
  • 网页游戏开发(2)「建议收藏」

    网页游戏开发(2)「建议收藏」                      网页游戏开发(2)                                               作者:任尚益                      …

    2022年5月18日
    42
  • 提升效率的秘密,仅需这一篇吃透负载均衡

    提升效率的秘密,仅需这一篇吃透负载均衡写在前面写本文的目的: 对负载均衡的理解零零散散,不成体系。 阅读这篇文章需要的条件: 对OSI模型有些许了解 有耐心。本文涉及大量的知识点,且只能用文字才能讲清楚,所以文字比较多。 收获: 读完此篇文章,从宏观的角度理解了负载均衡的原理以及实现机制。加深对分布式架构的了解 主要内容: 本文首先从概念开始,讲解什么是负载均衡,以及负载均衡在分布式系统中所承担的角色以及提供的功能。 讲解负载均衡的分类。分别从软硬件角度、地域范围角度以及…

    2022年7月19日
    12
  • 数据结构C语言严蔚敏版(第二版)超详细笔记附带课后习题[通俗易懂]

    数据结构C语言严蔚敏版(第二版)超详细笔记附带课后习题[通俗易懂]根据此书所做随笔笔记。一、绪论1.1、数据机构的研究内容用计算机解决实际问题时,步骤:首先分析实际问题,从中抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编程,调试,测试。寻求数据模型的实质是分析问题,从中提取出计算机处理的对象,并找出这些对象之间的关系,然后用数学的语言加以描述。关键:分析问题中所用到的数据是如何组织的,研究数据之间存在什么样的关系。由于数据必须在计算机中处理,因此不能局限于数据本身的数学问题的研究,还必须考虑数据的物理结构,即数据在计算机中的存储结构。1.

    2022年6月10日
    97
  • grub2引导u盘启动_grub4dos怎么进入系统

    grub2引导u盘启动_grub4dos怎么进入系统grub引导BT3硬盘启动                   阿太080611 一、这里使用grub引导程序,关于grub引导程序,这里不多说,其是一个很强的系统引导器,可以区分和引导各种系统.这里提供一个grubfordos安装程序;解压后copy到c:/boot/grub/目录下,并copymenu.lst和chinese目录中的文件grldr文件到C:/.

    2022年10月1日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号