?? 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 + -