⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 download.java

📁 java 多线程文件下载器源代码......
💻 JAVA
字号:
package com.sam.net.download;

import javax.swing.JTextArea;
import java.net.*;
import java.io.*;

public class Download extends Thread //分析要下载的文件并启动下载进程
{
    URL url;
    String saveAs;
    int nthread;
    String info=new String();
    JTextArea textArea=new JTextArea();
    boolean breakWhile=true;

    long[] position;
    long[] startPos;
    long[] endPos;
    DownloadThread[] dt; //子线程对象
    long fileLength;
    String filename;
    Search search;

    public Download(URL url,String saveAs,int nthread,JTextArea textArea,Search search) throws IOException
    {
        this.url=url;
        this.saveAs=saveAs;
        this.nthread=nthread;
        this.textArea=textArea;
        this.search = search;
        

        startPos=new long[nthread];
        endPos=new long[nthread];
        dt=new DownloadThread[startPos.length];
    }
   public void run()
   {
        info="目标文件: "+url;
        textArea.append("\n"+info+"\n文件下载中.............");
        info="线程总数: "+nthread;
        textArea.append("\n"+info);

        try
        {
            HttpURLConnection huc = (HttpURLConnection) url.openConnection();
            filename=url.getFile().substring(url.getFile().lastIndexOf("/")+1);
            fileLength=getFileSize();
            if (fileLength==-1)
            {
                textArea.append("\n不可知的文件长度!请重试!!\n");
            }
            else
            {
                if(fileLength==-2)
                {
                    textArea.append("\n文件无法获取!请重试!!\n");
                }
                else
                {
                	//将要下载的文件进行分段
                    for(int i=0;i<startPos.length;i++){
                        startPos[i]=(long) (i*(fileLength/startPos.length));
                    }
                    for(int i=0;i<endPos.length-1;i++)
                        endPos[i]=startPos[i+1];
                    endPos[endPos.length-1]=fileLength;
                  
                    
                    //启动一组子线程
                    for(int i=0;i<startPos.length;i++)
                    {
                        dt[i]=new DownloadThread(url,saveAs, startPos[i],endPos[i],search);
                        dt[i].start();
                    }
                   
                    while(breakWhile)
                    {
                        Thread.sleep(500);
                        breakWhile=false;
                        for(int i=0;i<dt.length;i++)
                        {
                            if(!dt[i].done)
                            {
                                breakWhile=true;
                                break;
                            }
                        }
                    }
                    search.status = search.COMPLETE;
                    search.stateChanged();
                    textArea.append("\n"+filename+"文件下载完毕!!\n");
                }
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
   
//    public void stopDownload()
//    {
//        for(int i=0;i<startPos.length;i++)
//        {
//            dt[i].setstop(false);
//        }
//    }
    
    public long getFileSize()
    {
        int fileLength=-1;
        try
        {
            HttpURLConnection huc=(HttpURLConnection)url.openConnection();
            int responseCode=huc.getResponseCode();
            if(responseCode>=400)
            {
                return -2;//Web服务器响应错误
            }
            String sHeader;
            for(int i=1;;i++)//查找标识文件长度的文件头,获取文件长度
            {
                sHeader=huc.getHeaderFieldKey(i);
                if(sHeader!=null)
                {
                    if(sHeader.equals("Content-Length"))
                    {
                        fileLength=Integer.parseInt(huc.getHeaderField(sHeader));
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        return fileLength;

    }
    }
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -