「断点下载java」断点下载技术

博主:adminadmin 2022-12-25 16:33:11 63

本篇文章给大家谈谈断点下载java,以及断点下载技术对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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实现HTTP断点续传功能

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

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后台怎么处理

实现思路:

(1) 创建一个下载任务类SiteInfoBean(用于记录文件保存的目录,文件下载URL,文件名)

(2) 创建一个FileAccessI 用于随机访问文件,向文件写入内容。

(3) 创建一个下载任务执行线程SiteFileFetch,此线程主要做如下工作

(a) 接受指定 下载子线程个数

(b) 首先判断下载的文件是否存在,

如果下载的文件已经存在则继续判断它对应的xxx.info文件是否存在,

如果info文件存在则认为是上次下载没有完成。此时读取info文件中的下载信息,分配下载区段。

如果info文件不存在,则认为已经下载完了,重新命名一个文件xxx(1),如果重新命名的文件也存在则继续累加命名xxx(2)...

(c) 判断临时文件xxx.info 文件(用于保存文件下载信息:下载子线程个数,子线程1开始位置,子线程1结束位置,子线程2开始位置,子线程2结束位置,...)

是否存在,存在则说明是上次没有下载完成,不存在则创建此临时info文件记录下载信息。

(d) 获取文件总长度,根据子线程个数将长度划分若干等分

(e) 创建若干子线程,为每个子线程分配下载区段(文件开始位置,文件结束位置),启动子线程

(f) 每隔500ms从各个子线程获取当前下载的进度位置,然后覆盖保存在xxx.info文件中。

(g) 每隔500ms同时判断是否存在没有下载完分配区段内容的子线程,如果存在则认为整个下载任务是没有完成的,如果不存在则认为总的已经下载完成。

(h) 每隔500ms同时统计出总的下载进度,当进度达到100%的时候,删除临时文件xx.info文件

java中的”断点“是什么意思?

这个不太难吧?

假设a给b传文件f(1024字节)。第一次b接收了512字节,那么第二次连接a就应该从513字节开始传输。

也就是说,在第二次传输时,b要提供“我要从513字节开始传送文件f”的信息,然后a使用fileinputstream构建输入流读取本地文件,使用skip(512)方法跳过文件f的前512字节再传送文件,之后b将数据追加(append)到先前接收的文件末尾即可。

进一步考虑,如果要实现多线程传送,即分块传输,也同样的道理。假如b要求分作两块同时传输,那么a启动两个线程,一个从513字节读到768字节(工256字节),第二个线程从769字节到1024字节即可。

如果你要从网络上下载文件,就是说a方不是你实现的,那么你要先确认a方支不支持断电续传功能(http1.1),然后你查阅下http1.1协议,在http1.1版本里,可以通过设置请求包头某个字段的信息(使用urlconnection创建连接并使用setrequestproperty(stringkey,stringvalue)方法设置)从而精确读取文件的某一段数据的。注意,基于http断点续传的关键是1.1版本,1.0版本是不支持的。

补充:

嗯,查到了,是设置range属性,即setrequestproperty("range","bytes=513-1024").你可以使用迅雷下载某个文件,然后从”线程信息“中就可以看到这个http1.1断点续传的所有行为信息了。

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

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

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

断点下载java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于断点下载技术、断点下载java的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。