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

📄 downfile.java

📁 用于多线程下载FTP文件, 有GUI界面, 可以直接编译
💻 JAVA
字号:
package multidownload;
import javax.swing.JTextArea;
import java.net.*;
import java.io.*;

public class DownFile extends Thread //分析要下载的文件并启动下载进程
{
    String dlURL;
    String saveFileAs;
    int nthread;
    String info=new String();
    JTextArea textArea=new JTextArea();

    long[] position;
    long[] startPos;
    long[] endPos;
    DownFileSplitter[] downFileSplitter; //子线程对象
    long fileLength;
    boolean stop=false;
    //DataOutputStream output;

    public DownFile(String sURL,String saveFileAs,int nthread,JTextArea textArea) throws IOException
    {
        this.dlURL=sURL;
        this.saveFileAs=saveFileAs;
        this.nthread=nthread;
        this.textArea=textArea;

        startPos=new long[nthread];
        endPos=new long[nthread];
    }

    public void run()
    {
        info="目标文件: "+dlURL;
        System.out.println(info);
        textArea.append("\n"+info);
        info="\n 线程总数: "+nthread;
        System.out.println(info);
        textArea.append("\n"+info);

        try
        {
            fileLength=getFileSize();
            if (fileLength==-1)
            {
                System.err.println("不可知的文件长度");
                textArea.append("\n 不可知的文件长度!请重试!!");
            }
            else
            {
                if(fileLength==-2)
                {
                    System.err.println("文件无法获取!");
                    textArea.append("\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++)
                    {
                        info="线程:"+i+"下载范围:"+startPos[i]+"--"+endPos[i];
                        System.out.println(info);
                        textArea.append("\n"+info);
                    }
                    downFileSplitter=new DownFileSplitter[startPos.length];//启动一组子线程

                    for(int i=0;i<startPos.length;i++)
                    {
                        downFileSplitter[i]=new DownFileSplitter(dlURL,saveFileAs,
                                startPos[i],endPos[i], i,textArea);
                        info="线程 "+i+"启动";
                        textArea.append("\n"+info);
                        downFileSplitter[i].start();
                        System.out.println(info);
                    }

                    boolean breakWhile=true;
                    while(breakWhile)
                    {
                        Thread.sleep(500);
                        breakWhile=false;
                        for(int i=0;i<downFileSplitter.length;i++)
                        {
                            if(!downFileSplitter[i].done)
                            {
                                breakWhile=true;
                                break;
                            }
                        }
                    }
                    System.out.println("文件传输结束!");//文件传输结束
                    textArea.append("\n 文件传输结束!");
                }
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }


    }
    public long getFileSize()
    {
        int fileLength=-1;
        try
        {
            URL url=new URL(dlURL);
            HttpURLConnection httpConnection=(HttpURLConnection) (url.openConnection());
            int responseCode=httpConnection.getResponseCode();
            if(responseCode>=400)
            {
                System.out.println("Web服务器响应错误");
                return -2;//Web服务器响应错误
            }
            String sHeader;
            for(int i=1;;i++)//查找标识文件长度的文件头,获取文件长度
            {
                sHeader=httpConnection.getHeaderFieldKey(i);
                if(sHeader!=null)
                {
                    if(sHeader.equals("Content-Length"))
                    {
                        fileLength=Integer.parseInt(httpConnection.getHeaderField(sHeader));
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        return fileLength;

    }
}

⌨️ 快捷键说明

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