📄 downloadfile.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 + -