松鼠的博客

导航

统计

java大文件断点续传实现代码

以下是一个基本的Java大文件断点续传实现代码,使用RandomAccessFile类。

import java.io.File;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

public class FileDownload {

    private static final int BUFFER_SIZE = 4096;

    public static void main(String[] args) {

        String fileURL = "http://example.com/file.zip";

        String saveDir = "C:/downloads/";

        String fileName = "file.zip";

        int numThreads = 4;

        try {

            URL url = new URL(fileURL);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            int responseCode = conn.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {

                int fileSize = conn.getContentLength();

                System.out.println("File size: " + fileSize);

                File file = new File(saveDir + fileName);

                RandomAccessFile raf = new RandomAccessFile(file, "rw");

                raf.setLength(fileSize);

                int chunkSize = fileSize / numThreads;

                for (int i = 0; i < numThreads - 1; i++) {

                    new DownloadThread(i * chunkSize, (i + 1) * chunkSize - 1, fileURL, saveDir + fileName).start();

                }

                new DownloadThread((numThreads - 1) * chunkSize, fileSize - 1, fileURL, saveDir + fileName).start();

                conn.disconnect();

            } else {

                System.out.println("Error: Server returned HTTP response code " + responseCode);

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    private static class DownloadThread extends Thread {

        private int startByte;

        private int endByte;

        private String fileURL;

        private String saveFilePath;

        public DownloadThread(int startByte, int endByte, String fileURL, String saveFilePath) {

            this.startByte = startByte;

            this.endByte = endByte;

            this.fileURL = fileURL;

            this.saveFilePath = saveFilePath;

        }

        @Override

        public void run() {

            try {

                URL url = new URL(fileURL);

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setRequestProperty("Range", "bytes=" + startByte + "-" + endByte);

                byte[] buffer = new byte[BUFFER_SIZE];

                RandomAccessFile raf = new RandomAccessFile(saveFilePath, "rw");

                raf.seek(startByte);

                int bytesRead;

                while ((bytesRead = conn.getInputStream().read(buffer)) != -1) {

                    raf.write(buffer, 0, bytesRead);

                }

                conn.disconnect();

                raf.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/27/java%e5%a4%a7%e6%96%87%e4%bb%b6%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e5%ae%9e%e7%8e%b0%e4%bb%a3%e7%a0%81/

欢迎入群一起讨论

 

 

posted on   Xproer-松鼠  阅读(29)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2020-10-27 HTML5 大文件上传解决方案(500M以上)
2020-10-27 Web项目 大文件上传解决方案(500M以上)
2020-10-27 HTTP 大文件上传解决方案(500M以上)
2020-10-27 CSharp 大文件上传解决方案(500M以上)
2020-10-27 .NET 大文件上传解决方案(500M以上)
2020-10-27 nginx上传大文件并支持中途取消上传
2020-10-27 百度WebUploader上传大文件并支持中途取消上传
点击右上角即可分享
微信分享提示