加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java多线程下载文件

发布时间:2020-12-14 23:38:29 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class MultiThreadDownFile {
    public static void main(String[] args) {
        try {
            String filePath = "http://dl_dir.qq.com/qqfile/qd/QQ2012Beta3_QQProtect2.8.exe";
            int threadNum = 5;
            new MultiThreadDown().down(filePath,threadNum);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MultiThreadDown extends Thread {

    private int threadId;
    private int block;
    private URL url;
    private File file;

    public MultiThreadDown() {
    }

    public MultiThreadDown(int threadId,int block,URL url,File file) {
        super();
        this.threadId = threadId;
        this.block = block;
        this.url = url;
        this.file = file;
    }

    public void down(String path,int threadNum) throws Exception {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        try {
            if (conn.getResponseCode() == 200) {
                int fileLength = conn.getContentLength();// Get the length of
                                                            // NetFile
                System.out.println("网络文件大小:" + fileLength);
                File file = new File(getFilename(path));
                RandomAccessFile raf = new RandomAccessFile(file,"rwd");
                raf.setLength(fileLength);
                raf.close();
                // 计算每条线程的下载量
                int block = fileLength % threadNum == 0 ? fileLength
                        / threadNum : fileLength / threadNum + 1;
                for (int threadId = 0; threadId < threadNum; threadId++) {
                    new MultiThreadDown(threadId,block,url,file).start();
                    System.out.println("线程" + threadId + "开始");
                }
            } else {
                System.out.println("Connection failed.");
            }
        } catch (Exception e) {
            System.out.println("连接失败.");
            e.printStackTrace();
        }
    }

    private String getFilename(String path) {
        return path.substring(path.lastIndexOf("/") + 1);
    }

    @Override
    public void run() {
        super.run();
        int start = threadId * block;// 计算线程下载的网络文件的文件位置
        int end = (threadId + 1) * block - 1;// 线程的结束位置
        try {
            RandomAccessFile raf = new RandomAccessFile(file,"rwd");
            raf.seek(start);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Range","bytes=" + start + "-" + end);
            if (conn.getResponseCode() == 206) {
                InputStream is = conn.getInputStream();
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = is.read(buf)) != -1) {
                    raf.write(buf,len);
                }
                raf.close();
                is.close();
            }
            System.out.println("第" + threadId + "线程下载完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读