package MultiThreadDownLoad;
import java.awt.event.KeyEvent;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class DownLoad extends javax.swing.JFrame implements Observer {
public DownLoad() {
initComponents();
jButtonOpenFolder.setEnabled(false);
}
private String fileName;//文件名
private String houZhui;//文件后缀
private String path;//自定义路径(目录)
private String savePath;//详细路径及文件
private long startTime, endTime;//定义初始、结束时间变量
public static int finishedThread = 0;//已完成的线程数
private int threadNum;//线程数量
private String sourcePath;//网址的字符串形式(源地址)
private long totalSize;//所下载文件的大小
private void startDownLowd(){
if(jTextFieldURL.getText().equals("")){
JOptionPane.showMessageDialog(this, "请输入文件下载地址!");
}else{
downloadFile();
}
}
private void downloadFile() {
jButtonDownLoad.setEnabled(false);
try {
URL u = new URL(URLDecoder.decode(jTextFieldURL.getText(), "gbk"));//解码
HttpURLConnection huc = (HttpURLConnection) u.openConnection();//生成一个HttpURLConnection对象
//先测试该站点是否支持断点下载
huc.setRequestMethod("HEAD");
totalSize = huc.getContentLength();
String s = huc.getHeaderField("Accept-Ranges");
if (s == null || !s.equals("bytes")) {
JOptionPane.showMessageDialog(this, "请求的文件不支持断点下载!");
jButtonDownLoad.setEnabled(true);
return;
}
//如果支持断点就继续进行!
sourcePath = u.toString();//把该URL转成字符串的形式
String pathName = u.getFile();
houZhui = pathName.substring(pathName.lastIndexOf('.'));//获取源文件的文件名
if(jTextFieldMuLu.getText().equals("")){
String filename=pathName.substring(pathName.lastIndexOf('/') + 1);
File file = new File("");
path = file.getAbsolutePath();
jTextFieldMuLu.setText(path);
jTextFieldRename.setText(filename);
savePath = path + File.separator + filename;
} else {
fileName = jTextFieldRename.getText();
path = jTextFieldMuLu.getText();
savePath = path + File.separator + fileName + houZhui; //所下载文件的所在路径
jTextFieldRename.setText(fileName + houZhui);
}
//具体的多线程下载分配
threadNum = this.jComboBoxThreadNumbers.getSelectedIndex() + 1;//设置线程数
int averageThreadSize = (int) (totalSize / threadNum);//每个线程需要下载文件的字节数
startTime = System.currentTimeMillis();
//启动所有线程
for (int i = 0; i < threadNum; i++) {
if (i == threadNum - 1) {
MultiThreadDownLoadFiles f = new MultiThreadDownLoadFiles(savePath, sourcePath, (long) (i * averageThreadSize), (long) (totalSize - 1));
//添加对f的观察者
f.addObserver(this);
new Thread(f).start();
} else {
MultiThreadDownLoadFiles f = new MultiThreadDownLoadFiles(savePath, sourcePath, (long) (i * averageThreadSize), (long) ((i + 1) * averageThreadSize - 1));
f.addObserver(this);
new Thread(f).start();
}
}
} catch (Exception ie) {
}
}
public void update(Observable arg0, Object arg1) {
if (DownLoad.finishedThread == threadNum) {
endTime = System.currentTimeMillis();
int returnValue = JOptionPane.showConfirmDialog(this, "下载完毕!总耗时" + (endTime - startTime) / 1000 + "秒。\n是否打开文件所在文件夹?", "请注意了......", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (returnValue == JOptionPane.YES_OPTION) {
try {
Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL " + path); //打开文件所在的文件夹
} catch (Exception e) {
}
}
jButtonDownLoad.setEnabled(true);
jButtonOpenFolder.setEnabled(true);
DownLoad.finishedThread = 0;//完成后重新置为0
}
}
private void scan(){
JFileChooser foder = new JFileChooser();
foder.setCurrentDirectory(new File("."));
foder.setDialogType(JFileChooser.DIRECTORIES_ONLY + JFileChooser.SAVE_DIALOG);
foder.setDialogTitle("请你选择所要保存文件的路径");
if (foder.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) {
return;
}
path = foder.getCurrentDirectory().getAbsolutePath();
jTextFieldMuLu.setText(path);
fileName = foder.getName(foder.getSelectedFile());
jTextFieldRename.setText(fileName);
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jTextFieldURL = new javax.swing.JTextField();
jSeparator1 = new javax.swing.JSeparator();
jLabel2 = new javax.swing.JLabel();
jTextFieldMuLu = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
jTextFieldRename = new javax.swing.JTextField();
jSeparator2 = new javax.swing.JSeparator();
jLabelThreadNumber = new javax.swing.JLabel();
jComboBoxThreadNumbers = new javax.swing.JComboBox();
jButtonScan = new javax.swing.JButton();
jLabel5 = new javax.swing.JLabel();
jButtonDownLoad = new javax.swing.JButton();
jButtonExit = new javax.swing.JButton();
jButtonOpenFolder = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("新的下载");
setResizable(false);
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
jLabel1.setFont(new java.awt.Font("宋体", 0, 14));
jLabel1.setText("URL:");
jTextFieldURL.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
jTextFieldURLKeyPressed(evt);
}
});
jLabel2.setFont(new java.awt.Font("宋体", 0, 14));
jLabel2.setText("存储目录:");
jLabel4.setFont(new java.awt.Font("宋体", 0, 14));
jLabel4.setText("另存名称:");
jLabelThreadNumber.setFont(new java.awt.Font("宋体", 0, 14));
jLabelThreadNumber.setText("请选择线程数:");
jComboBoxThreadNumbers.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1个线程", "2个线程", "3个线程", "4个线程", "5个线程", "6个线程", "7个线程", "8个线程" }));
jButtonScan.setText("浏览...");
jButtonScan.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonScanActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align
Java实现多线程下载源代码
5星 · 超过95%的资源 需积分: 10 167 浏览量
2008-07-03
18:37:56
上传
评论
收藏 52KB RAR 举报
superww058
- 粉丝: 13
- 资源: 28
最新资源
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
- 粒子群算法优化BP神经网络PSO-BP的MATLAB代码(数值预测)
- 基于Springboot的一起看书平台.zip
- 无头单向非循环链表的实现(SList.h)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈