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

📄 downloadfile.java

📁 java多线程下载(程序源码) 只具备简单功能
💻 JAVA
字号:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import javax.swing.Timer;

public class DownLoadFile extends Thread {
private JPanel progressPane;

private String URL;

private String saveURL;

int nthread;

String info = new String();

JTextArea textArea = new JTextArea();

JProgressBar jProgressBar;

long[] startPos;

long[] endPos;

long fileLength;

LownLoadFileThread[] downFileSplitter;

Timer timer;

public DownLoadFile(String URL, String saveURL, JTextArea textArea,
    int nthread, JProgressBar jProgressBar) {
   this.jProgressBar = jProgressBar;
   this.URL = URL;
   this.saveURL = saveURL;
   this.nthread = nthread;
   this.startPos = new long[nthread];
   this.endPos = new long[nthread];
   this.textArea = textArea;
}

public void run() {
   info = "目标文件: " + URL;
   textArea.append("\n" + info);
   info = "\n 线程总数: " + nthread;
   textArea.append("\n" + info);
   try {
    fileLength = getFileSize(URL);
    // System.out.println("fileLength is :"+fileLength);
    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 LownLoadFileThread[startPos.length];
      jProgressBar.setMaximum(100);
      jProgressBar.setMinimum(0);
      // jProgressBar.isStringPainted();
      jProgressBar.setStringPainted(true);
      jProgressBar.setString("0%");
      // progressPane.add(jProgressBar);

      for (int i = 0; i < startPos.length; i++) {
       downFileSplitter[i] = new LownLoadFileThread(URL,
         startPos[i], endPos[i], i, textArea,
         jProgressBar, saveURL);
       info = "线程 " + i + "启动";
       textArea.append("\n" + info);
       downFileSplitter[i].start();
       // System.out.println(info);
      }
      timer = new Timer(100, new ActionListener() {

       public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        int readTotal = 0;
        boolean finished = true;
        for (int i = 0; i < startPos.length; i++) {
         if (downFileSplitter[i].isAlive())
          finished = false;

         readTotal += downFileSplitter[i].getReadPos();
         //System.out.println("readTotal is :"+readTotal);

        }
        jProgressBar
          .setValue((int) ((long) (readTotal) * 100f / fileLength));
        jProgressBar
          .setString((int) ((long) (readTotal) * 100f / fileLength)
            + "%");

        if (finished) {
         if ((long) readTotal == fileLength)
          JOptionPane.showMessageDialog(null,
            "下载完成!!!");
         else
          JOptionPane.showMessageDialog(null,
            "未能完成下载!!!");
         timer.stop();
        }
       }

      });
      timer.start();

     }
    }
   } catch (Exception ex) {

   }
}

public long getFileSize(String URL) {
   int fileLength = -1;
   try {
    URL url = new URL(URL);
    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")) {
       int length=httpConnection.getContentLength();
       textArea.append("\n 文件长度:---"+length);
       fileLength = Integer.parseInt(httpConnection
         .getHeaderField(sHeader));
       textArea.append("\n 可知的文件长度:"+fileLength);
       break;
      }
     } else {
      break;
     }
    }
   } catch (Exception ex) {
    ex.printStackTrace();
   }
   return fileLength;

}
}

⌨️ 快捷键说明

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