📄 downfile.java
字号:
package down2;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.swing.event.EventListenerList;
import down2.event.MultiDownloadListener;
import down2.event.ThreadNotifyEvent;
import down2.event.ThreadNotifyListener;
/**
*
* <p>Title: DownFile.java</p>
* <p>Description: </p>
* <p>Copyright:OnewaveInc Copyright (c) 2007</p>
* <p>Company: OnewaveInc</p>
* @author Zhengrw
* @version 3.0
*/
public class DownFile extends Thread {
String dlURL;
String saveFileAs;
int nthread;
String info = new String();
long[] position;
long[] startPos;
long[] endPos;
DownFileSplitter[] downFileSplitter; //子线程对象
long fileLength;
boolean stop = false;
//DataOutputStream output;
private EventListenerList listenerList = new EventListenerList();
public DownFile(String sURL, String saveFileAs, int nthread) throws IOException {
this.dlURL = sURL;
this.saveFileAs = saveFileAs;
this.nthread = nthread;
startPos = new long[nthread];
endPos = new long[nthread];
}
public void run() {
info = "目标文件: " + dlURL;
System.out.println(info);
info = "\n 线程总数: " + nthread;
System.out.println(info);
try {
fileLength = getFileSize();
if (fileLength == -1) {
System.err.println("不可知的文件长度");
// textArea.append("\n 不可知的文件长度!请重试!!");
fireException(ThreadNotifyEvent.DL_EXCEPTION_FILE_LENGTH);
} else {
if (fileLength == -2) {
System.err.println("文件无法获取!");
// textArea.append("\n 文件无法获取!请重试!!");
fireException(ThreadNotifyEvent.DL_EXCEPTION_FILE_EXSITS);
} 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);
fireNotify(i, ThreadNotifyEvent.DL_NOTIFY_SCOPE,startPos[i],endPos[i]);
}
downFileSplitter = new DownFileSplitter[startPos.length];
//启动一组子线程
for (int i = 0; i < startPos.length; i++) {
downFileSplitter[i] = new DownFileSplitter(dlURL,
saveFileAs, startPos[i], endPos[i], i);
for(MultiDownloadListener listener : this.listenerList.getListeners(MultiDownloadListener.class)){
downFileSplitter[i].addMultiDownloadListener(listener);
}
info = "线程 " + i + "启动";
// textArea.append("\n" + info);
fireNotify(i, ThreadNotifyEvent.DL_NOTIFY_START);
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 文件传输结束!");
fireNotify( ThreadNotifyEvent.DL_NOTIFY_FILE_END);
}
}
} 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;
}
private void fireException(int type){
ThreadNotifyEvent event = new ThreadNotifyEvent(this);
event.setType(type);
for(ThreadNotifyListener listener : this.listenerList.getListeners(ThreadNotifyListener.class)){
listener.exceptionOccured(event);
}
}
private void fireNotify(int type){
fireNotify(0,type);
}
private void fireNotify(int threadID,int type){
ThreadNotifyEvent event = new ThreadNotifyEvent(this);
event.setThreadId(threadID);
event.setType(type);
for(ThreadNotifyListener listener : this.listenerList.getListeners(ThreadNotifyListener.class)){
listener.notifyInfo(event);
}
}
private void fireNotify(int threadID,int type,long start,long end){
ThreadNotifyEvent event = new ThreadNotifyEvent(this);
event.setThreadId(threadID);
event.setType(type);
event.setStart(start);
event.setEnd(end);
for(ThreadNotifyListener listener : this.listenerList.getListeners(ThreadNotifyListener.class)){
listener.notifyInfo(event);
}
}
public void addThreadNotifyLitener(ThreadNotifyListener listener){
this.listenerList.add(ThreadNotifyListener.class, listener);
}
public void removeThreadNotifyLitener(ThreadNotifyListener listener){
this.listenerList.remove(ThreadNotifyListener.class, listener);
}
public void addMultiDownloadListener(MultiDownloadListener listener){
this.listenerList.add(MultiDownloadListener.class, listener);
}
public void removeMultiDownloadListener(MultiDownloadListener listener){
this.listenerList.remove(MultiDownloadListener.class, listener);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -