Java多线程下载文件详解编程语言

 
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(); 
        } 
    } 
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10782.html

(0)
上一篇 2021年7月19日 10:28
下一篇 2021年7月19日 10:28

相关推荐

发表回复

登录后才能评论