java的断点下载,java文件下载断点续传

发布时间:2022-11-22

本文目录一览:

  1. java 断点续传需要哪些jar包
  2. java实现文件的断点续传和断点下载,有知道的交流下。
  3. 如何用Java实现HTTP断点续传功能
  4. 通过java实现文件下载
  5. java Ftp上传下载断点续传怎样实现?

java 断点续传需要哪些jar包

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();
        }
    }
}

java实现文件的断点续传和断点下载,有知道的交流下。

/**
 * 下载服务器已存在的文件
 *
 * @param request
 * @param response
 * @param proposeFile
 * @throws IOException
 * @throws FileNotFoundException
 */
private void downloadExistsFile(HttpServletRequest request,
                                HttpServletResponse response, File proposeFile) throws IOException,
        FileNotFoundException {
    log.debug("下载文件路径:" + proposeFile.getPath());
    long fSize = proposeFile.length();
    // 下载
    response.setContentType("application/x-download");
    String isoFileName = this
            .encodeFilename(proposeFile.getName(), request);
    response.setHeader("Accept-Ranges", "bytes");
    response.setHeader("Content-Length", String.valueOf(fSize));
    response.setHeader("Content-Disposition", "attachment; filename="
            + isoFileName);
    long pos = 0;
    if (null != request.getHeader("Range")) {
        // 断点续传
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
        try {
            pos = Long.parseLong(request.getHeader("Range").replaceAll(
                    "bytes=", "").replaceAll("-", ""));
        } catch (NumberFormatException e) {
            log.error(request.getHeader("Range") + " is not Number!");
            pos = 0;
        }
    }
    ServletOutputStream out = response.getOutputStream();
    BufferedOutputStream bufferOut = new BufferedOutputStream(out);
    InputStream inputStream = new FileInputStream(proposeFile);
    String contentRange = new StringBuffer("bytes ")
            .append(new Long(pos).toString()).append("-").append(
            new Long(fSize - 1).toString()).append("/").append(
            new Long(fSize).toString()).toString();
    response.setHeader("Content-Range", contentRange);
    log.debug("Content-Range", contentRange);
    inputStream.skip(pos);
    byte[] buffer = new byte[5 * 1024];
    int length = 0;
    while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
        bufferOut.write(buffer, 0, length);
    }
    bufferOut.flush();
    bufferOut.close();
    out.close();
    inputStream.close();
}

如何用Java实现HTTP断点续传功能

断点设置方法,当有临时文件时,直接在临时文件中读取上次下载中断时的断点位置。没有临时文件,即第一次下载时,重新设置断点。 rantmpfile.seek()跳转到一个位置的目的是为了让各个断点存储的位置尽量分开。

通过java实现文件下载

在jsp/servlet中断点/多线程下载文件

<%@ page import="java.io.File" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.RandomAccessFile" %>
<%! 
public void downloadFile(HttpServletRequest request, HttpServletResponse response, File file) throws IOException {
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    java.io.FileInputStream fis = new java.io.FileInputStream(raf.getFD());
    response.setHeader("Server", "");
    response.setHeader("Accept-Ranges", "bytes");
    long pos = 0;
    long len;
    len = raf.length();
    if (request.getHeader("Range") != null) {
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
        pos = Long.parseLong(request.getHeader("Range")
                .replaceAll("bytes=", "")
                .replaceAll("-", ""));
    }
    response.setHeader("Content-Length", Long.toString(len - pos));
    if (pos != 0) {
        response.setHeader("Content-Range", new StringBuffer()
                .append("bytes ")
                .append(pos)
                .append("-")
                .append(Long.toString(len - 1))
                .append("/")
                .append(len)
                .toString());
    }
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", new StringBuffer()
            .append("attachment;filename=\"")
            .append(file.getName())
            .append("\"").toString());
    raf.seek(pos);
    byte[] b = new byte[2048];
    int i;
    OutputStream outs = response.getOutputStream();
    while ((i = raf.read(b)) != -1) {
        outs.write(b, 0, i);
    }
    raf.close();
    fis.close();
}
%>
<%
String filePath = request.getParameter("file");
filePath = application.getRealPath(filePath);
File file = new File(filePath);
downloadFile(request, response, file);
%>

是否可以解决您的问题?

java Ftp上传下载断点续传怎样实现?

最关键的一点是设置Http请求头,注意后面有一个“-”,不要落下。

httpget.addHeader("RANGE", "bytes=" + offset + "-");