zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }

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

  • 相关阅读:
    jquery跨域请求jsonp
    php返回json,xml,JSONP等格式的数据
    chrome常用配置
    html body标签的几个属性 禁用鼠标右键,禁用鼠标选中文字等
    jquery form表单序列号
    php实时输出内容能够
    php Xdebug调试
    jsonp的简单例子
    web调试的一些小技巧
    jq动态增加的button标签click回调失效的问题,即动态增加的button标签绑定事件$("button.class").click(function)无效
  • 原文地址:https://www.cnblogs.com/xmcx1995/p/5781376.html
Copyright © 2011-2022 走看看