Java多线程下载文件

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
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, 0, len);
                }
                raf.close();
                is.close();
            }
            System.out.println("第" + threadId + "线程下载完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

标签: 网络

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:Quartz2D的基本用法

下一篇: iOS 实现文件的拷贝