Java-->实现断点续传(下载)

--> 断点续传: 就像迅雷下载文件一样,停止下载或关闭程序,下次下载时是从上次下载的地方开始继续进行,而不是重头开始...

--> RandomAccessFile --> pointer(文件指针) --> seek(移动文件指针) --> 断点续传

package com.dragon.java.downloadfile;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/*
 断点续传:对下载软件非常重要!
 --> 第一次下载 100 字节
 --> 第二次下载 101 字节...想办法知道上次从哪个地方断掉的。  上次已经下载到了什么位置。  记下断点的位置
 ------> 需要第三方的文件专门记住断点的位置
 */
public class Test {
    public static void main(String args[]) {
        File srcFile = new File("D:/Java4Android/01_Java考古学/01_Java考古学.mp4");
        File desDir = new File("f:/vidio");
        copyFileToDir(srcFile, desDir);
    }

    public static void copyFileToDir(File srcFile, File desDir) {
        desDir.mkdirs();
        // 创建配置文件
        File configFile = new File(desDir, srcFile.getName().split("\\.")[0]
                + ".config");
        // 创建目标文件
        File desFile = new File(desDir, srcFile.getName());
        if (!configFile.exists() && desFile.exists()) {
            System.out.println("已下载过该文件!");
            return;
        }
        RandomAccessFile rafSrc = null;
        RandomAccessFile rafDes = null;
        RandomAccessFile rafConfig = null;
        try {
            rafSrc = new RandomAccessFile(srcFile, "r");
            rafDes = new RandomAccessFile(desFile, "rw");
            rafConfig = new RandomAccessFile(configFile, "rw");

            // 设置目标文件和源文件一样长
            rafDes.setLength(srcFile.length());
            // 设置配置的文件长度为8,防止第一次下载是出现EOF 异常
            rafConfig.setLength(8);

            // 从上次下载的位置开始继续下载!
            long pointer = rafConfig.readLong();
            System.out.println("已下载:" + ((float) pointer / srcFile.length())
                    * 100 + "%");
            rafSrc.seek(pointer);
            rafDes.seek(pointer);

            // 单次传输长度设置小点,好观察是否断点续传
            byte[] buffer = new byte[32];
            int len = -1;
            // 每次复制的开始,必须把源文件的指针和目标文件的指针从上次断开的位置去读
            while ((len = rafSrc.read(buffer)) != -1) {
                rafDes.write(buffer, 0, len);
                // 在配置文件写的时候,每次使文件指针移动到最初的位置 --> 这样永远对只会存储前8个字节
                rafConfig.seek(0);
                // 每复制一次之和,赶紧记录下文件指针的位置,以备断点续传使用。
                rafConfig.writeLong(rafSrc.getFilePointer());
            }

        } catch (IOException e) {
            System.out.println(e);
        } finally {
            try {
                rafSrc.close();
                rafDes.close();
                rafConfig.close();
            } catch (IOException e) {
                System.out.println(e);
            }
            // 在流关闭之后删除配置文件
            System.out.println("下载成功!");
            configFile.delete();
        }
    }
}

--> 通过复制来模拟简单的断点续传...

时间: 2024-10-11 03:49:50

Java-->实现断点续传(下载)的相关文章

java多线程断点续传下载

断点续传就是利用临时文件,在下载的时候把每个线程下载的进度存到一个进度文件里,等下次再下载的时候直接从进度文件里读取这个值,然后+上开始时候的值继续下载就可以了 package down; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import ja

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

java实现多线程下载

本篇博客可认为是对 使用java实现http多线程下载 一文的再次解读. 首先,从宏观来说 java实现多线程下载这个功能的实现由以下几部分组成: 1 建立多个线程去分别下载文件的一部分. 2 将多个线程下载的文件(还在内存中),写入硬盘中的一个文件. 3 断点续传 GET /Path/FileName HTTP/1.0 Host: www.server.com:80 Accept: */* User-Agent: GeneralDownloadApplication Connection: c

Android多线程断点续传下载

这个月接到一个项目,要写一个像360助手一样的对于软件管理的APP:其中,遇到了一个问题:多线程断点下载 这个 ,由于之前没有写过这方面的应用功能.所以,不免要自学了.然后就在各个昂站上收索并整理了一下.跟大家分享一下,也能加深我在这方面的理解. 什么是多线程下载? 多线程下载其实就是迅雷,BT一些下载原理,通过多个线程同时和服务器连接,那么你就可以榨取到较高的带宽了,大致做法是将文件切割成N块,每块交给单独一个线程去下载,各自下载完成后将文件块组合成一个文件,程序上要完成做切割和组装的小算法

java 实现断点续传

/** * 下载服务器已存在的文件,支持断点续传 * * @param request * 请求对象 * @param response * 响应对象 * @param path * 文件路径(绝对) */ public static void download(HttpServletRequest request, HttpServletResponse response, File proposeFile) { LOGGER.debug("下载文件路径:" + proposeFil

在ASP.NET中支持断点续传下载大文件(ZT)

IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag         客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传的下载: Accept-Ranges:告知下载客户端这是一个可以恢复续传的下载,存放本次下载的开始字节位置.文件的字节大小: ETag:保存文件的唯一标识(我在用的文件名+文件最后修改时间,以便续传请求时对文件进行

Android实现网络多线程断点续传下载(转)

本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是:  (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 R

Android之断点续传下载

今天学习了Android开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节还烦恼的人参考.这里我以下载mp3文件为例.断点续传下载,顾名思义,那就是我们在一次下载未结束时,退出下载,第二次下载时会接着第一次下载的进度继续下载.那么怎么记录第一次下载的数据呢,这里肯定就要用到数据库了.下面就是我创建数据库的一个SQLiteOpenHelper类.用来首次运行时创建数据库.D

Android实现网络多线程断点续传下载

本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 Ra

android 多线程断点续传下载 四 - 仿下载助手

我们先一起简单回顾下它的基本原理. http://blog.csdn.net/shimiso/article/details/6763664  android 多线程断点续传下载 一 http://blog.csdn.net/shimiso/article/details/6763986  android 多线程断点续传下载 二 http://blog.csdn.net/shimiso/article/details/8448544  android 多线程断点续传下载 三 界面效果 线程池 T