本文目錄一覽:
- 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 + “-“);
原創文章,作者:DOWF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/142392.html