第一题:多线程下载,显示下载进度条。(暂停功能个和断点续传待开发)。
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Component;
import java.net.URL;
import java.net.URLConnection;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.List;
import java.util.ArrayList;
import java.util.Properties;
class Download{
private static final long serialVersionUID = -6944831795769317874L;
public static void main(String[] args){
new DownloadWindow();
}
}
class DownloadWindow extends JFrame{
private JTextArea url_text;
private JTextArea local_text;
private JButton pause_button;
private JProgressBar[] bar_arr;
public boolean is_pause = false;
private int every_count = 0;
public DownloadWindow(){
ini();
}
public void ini(){
this.setSize(600,400);
this.setLocation(600,300);
this.setLayout(null);
JLabel url_label = new JLabel("URL : ");
url_label.setBounds(10,10,100,20);
this.add(url_label);
url_text = new JTextArea();
url_text.setEditable(true);
url_text.setBounds(100,10,400,20);
this.add(url_text);
JLabel local_label = new JLabel("Local : ");
local_label.setBounds(10,40,100,20);
this.add(local_label);
local_text = new JTextArea();
local_text.setEditable(true);
local_text.setBounds(100,40,400,20);
this.add(local_text);
JButton down_button = new JButton("Download");
down_button.setBounds(200,110,100,50);
down_button.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
String src_url = url_text.getText();
String local_addr = local_text.getText();
DownloadManager manager = new DownloadManager(DownloadWindow.this,src_url,local_addr,5);
addBar(manager.getListInfo());
manager.start();
}
});
this.add(down_button);
JButton pause_button = new JButton("Stop");
pause_button.setBounds(320,110,100,50);
pause_button.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
DownloadWindow.this.is_pause = !DownloadWindow.this.is_pause;
pause_button.setText(DownloadWindow.this.is_pause ? "Start" : "Stop");
String src_url = url_text.getText();
String local_addr = local_text.getText();
if(!DownloadWindow.this.is_pause){
List<DownloadInfo> info_list = new ArrayList<DownloadInfo>();
try{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(local_addr + ".tmp"));
List<DownloadInfo> list = (List<DownloadInfo>)ois.readObject();
}catch(Exception ex){
ex.printStackTrace();
}
DownloadManager manager = new DownloadManager(DownloadWindow.this,info_list);
addBar(manager.getListInfo());
manager.start();
}
}
});
this.add(pause_button);
this.setVisible(true);
}
public void addBar(List<DownloadInfo> info_list){
bar_arr = new JProgressBar[info_list.size()];
int y = 200;
for(int i=0;i<info_list.size();i++){
DownloadInfo info = info_list.get(i);
bar_arr[i] = new JProgressBar();
System.out.println("===" + info.getEndPos());
System.out.println("---" + info.getStartPos());
bar_arr[i].setMaximum(info.getEndPos() - info.getStartPos() + 1);
bar_arr[i].setBounds(100,y + (i*25),400,10);
this.add(bar_arr[i]);
}
this.repaint();
}
public void updateBar(int length,int index){
int new_value = bar_arr[index].getValue() + length;
System.out.println(new_value);
bar_arr[index].setValue(new_value);
if(new_value >= bar_arr[index].getMaximum()){
every_count ++;
if(every_count >= bar_arr.length){
finishBar();
}
}
}
public void finishBar(){
for(Component comp : bar_arr){
this.remove(comp);
}
this.repaint();
}
}
class DownloadManager{
private DownloadWindow window;
private String src_url;
private String local_addr;
private int count;
private DownloadInfo info;
private List<DownloadInfo> info_list;
public DownloadManager(DownloadWindow window,List<DownloadInfo> info_list){
this.window = window;
this.info_list = info_list;
}
public DownloadManager(DownloadWindow window,String src_url,String local_addr,int count){
this.window = window;
this.src_url = src_url;
this.local_addr = local_addr;
this.count = count;
prepareDownload();
}
public void prepareDownload(){
info_list = new ArrayList<DownloadInfo>();
try{
URL url = new URL(src_url);
int total_length = url.openConnection().getContentLength();
RandomAccessFile raf = new RandomAccessFile(local_addr,"rw");
raf.setLength(total_length);
raf.close();
int block = total_length / count;
DownloadInfo info = null;
for(int i = 0;i < count;i++){
info = new DownloadInfo();
info.setIndex(i);
info.setSrcUrl(src_url);
info.setLocalAddr(local_addr);
info.setStartPos(i * block);
if((count - 1) == i){
info.setEndPos(total_length - 1);
}else{
info.setEndPos((i + 1) * block - 1);
}
info_list.add(info);
}
}catch(Exception e){
e.printStackTrace();
}
}
private List<DownloadInfo> readListInfo(File tmp_file){
List<DownloadInfo> info_list = new ArrayList<DownloadInfo>();
try{
Properties prop = new Properties();
prop.load(new FileInputStream(tmp_file));
String tmp_url = prop.getProperty("url");
int count = Integer.parseInt(prop.getProperty("count"));
DownloadInfo info = null;
for(int i=0;i<count;i++){
String value = prop.getProperty("Thread." + i);
String[] arr = value.split(";");
info = new DownloadInfo();
info.setIndex(i);
info.setSrcUrl(tmp_url);
info.setStartPos(Integer.parseInt(arr[0]));
info.setEndPos(Integer.parseInt(arr[1]));
info.setAmount(Integer.parseInt(arr[2]));
String path = tmp_file.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("."));
info.setLocalAddr(path);
info_list.add(info);
}
return info_list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
public void start(){
for(DownloadInfo info : info_list){
try{
DownloadThread s = new DownloadThread(window,info);
s.start();
s.join();
}catch(Exception e){
e.printStackTrace();
}
}
if(window.is_pause){
try{
FileOutputStream fos = new FileOutputStream(local_addr + ".tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(info_list);
}catch(Exception e){
e.printStackTrace();
}
}
}
public List<DownloadInfo> getListInfo(){
return info_list;
}
}
class DownloadThread extends Thread{
private DownloadWindow window;
private DownloadInfo info;
public DownloadThread(DownloadWindow window,DownloadInfo info){
this.window = window;
this.info = info;
}
public void run(){
try{
URL url = new URL(info.getSrcUrl());
URLConnection connect = url.openConnection();
connect.setRequestProperty("Range","bytes=" + info.getStartPos() + "-" + info.getEndPos());
InputStream in = connect.getInputStream();
RandomAccessFile raf = new RandomAccessFile(info.getLocalAddr(),"rw");
raf.seek(info.getEndPos());
byte[] buf = new byte[1024];
int length = 0;
while((length = in.read(buf)) != -1){
System.out.println(length + "++" + info.getIndex());
raf.write(buf,0,length);
window.updateBar(length,info.getIndex());
Thread.sleep(2000);
if(window.is_pause){
break;
}
}
raf.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
class DownloadInfo{
private String src_url;
private String local_addr;
private int start_pos;
private int end_pos;
private int index;
private int amount;
public DownloadInfo(){
}
public DownloadInfo(String src_url,String local_addr,int start_pos,int end_pos){
this.src_url = src_url;
this.local_addr = local_addr;
this.start_pos = start_pos;
this.end_pos = end_pos;
}
public String getSrcUrl(){
return src_url;
}
public void setSrcUrl(String src_url){
this.src_url = src_url;
}
public String getLocalAddr(){
return local_addr;
}
public void setLocalAddr(String local_addr){
this.local_addr = local_addr;
}
public int getStartPos(){
return start_pos;
}
public void setStartPos(int start_pos){
this.start_pos = start_pos;
}
public int getEndPos(){
return end_pos;
}
public void setEndPos(int end_pos){
this.end_pos = end_pos;
}
public int getIndex(){
return index;
}
public void setIndex(int index){
this.index = index;
}
public int getAmount(){
return amount;
}
public void setAmount(int amount){
this.amount = amount;
}
}
转载于:https://blog.51cto.com/senlinmin/1793104