java编写的Http协议的多线程下载器
断点下载器还在实现中。。。。。。
//////////////////////////////////界面///////////////////////////////////////////
package com.company.www.me.net;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class DownLoadTool extends JFrame {
public static void main(String[] args) {
final DownLoadTool tool = new DownLoadTool();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(tool.getContentPane());
} catch (Exception e) {
e.printStackTrace();
}
tool.setResizable(false);
tool.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tool.setTitle("DownLoadTool");
int x = Toolkit.getDefaultToolkit().getScreenSize().width/2-180;
int y = Toolkit.getDefaultToolkit().getScreenSize().height/2-90;
tool.setLocation(x,y);
tool.setSize(430, 280);
tool.setLayout(new GridBagLayout());
JLabel label = new JLabel("URL: ");
GridBagConstraints labelCtrl = new GridBagConstraints();
labelCtrl.gridx = 0;
labelCtrl.gridy = 0;
labelCtrl.gridheight = 1;
labelCtrl.gridwidth = 1;
labelCtrl.anchor = GridBagConstraints.WEST;
JScrollPane scrollPane = new JScrollPane();
final JTextArea textArea = new JTextArea();
scrollPane.setViewportView(textArea);
scrollPane.setPreferredSize(new Dimension(320,33));
GridBagConstraints scrollPaneCtrl = new GridBagConstraints();
scrollPaneCtrl.gridx = 1;
scrollPaneCtrl.gridy = 0;
scrollPaneCtrl.gridheight = 1;
scrollPaneCtrl.gridwidth = 2;
scrollPaneCtrl.anchor = GridBagConstraints.EAST;
scrollPaneCtrl.insets = new Insets(8,0,8,0);
JLabel label2 = new JLabel("To: ");
GridBagConstraints label2Ctrl = new GridBagConstraints();
label2Ctrl.gridx = 0;
label2Ctrl.gridy = 1;
label2Ctrl.gridheight = 1;
label2Ctrl.gridwidth = 1;
label2Ctrl.anchor = GridBagConstraints.WEST;
final JTextField textField = new JTextField(22);
textField.setText("C:/Documents and Settings/wangbijian/デスクトップ/WebTest/DownLoad");
GridBagConstraints textFieldCtrl = new GridBagConstraints();
textFieldCtrl.gridx = 1;
textFieldCtrl.gridy = 1;
textFieldCtrl.gridheight = 1;
textFieldCtrl.gridwidth = 1;
JButton Tobtn = new JButton("Choose Path...");
Tobtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent actionevent) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fileChooser.showOpenDialog(tool);
if(returnVal == JFileChooser.APPROVE_OPTION) {
textField.setText(fileChooser.getSelectedFile().toString());
}
}
});
GridBagConstraints TobtnCtrl = new GridBagConstraints();
TobtnCtrl.gridx = 2;
TobtnCtrl.gridy = 1;
TobtnCtrl.gridheight = 1;
TobtnCtrl.gridwidth = 1;
TobtnCtrl.anchor = GridBagConstraints.EAST;
JLabel label3 = new JLabel("Thread Count: ");
GridBagConstraints label3Ctrl = new GridBagConstraints();
label3Ctrl.gridx = 0;
label3Ctrl.gridy = 2;
label3Ctrl.gridheight = 1;
label3Ctrl.gridwidth = 1;
label3Ctrl.insets = new Insets(8,0,0,0);
label3Ctrl.anchor = GridBagConstraints.WEST;
final JTextField threadField = new JTextField(28);
GridBagConstraints threadFieldCtrl = new GridBagConstraints();
threadFieldCtrl.gridx = 1;
threadFieldCtrl.gridy = 2;
threadFieldCtrl.gridheight = 1;
threadFieldCtrl.gridwidth = 2;
threadFieldCtrl.insets = new Insets(8,0,0,0);
threadFieldCtrl.anchor = GridBagConstraints.WEST;
final JScrollPane progressPane = new JScrollPane();
progressPane.setPreferredSize(new Dimension(380,80));
final JPanel panel = new JPanel();
progressPane.setViewportView(panel);
GridBagConstraints progressPaneCtrl = new GridBagConstraints();
progressPaneCtrl.gridx = 0;
progressPaneCtrl.gridy = 4;
progressPaneCtrl.gridheight = 1;
progressPaneCtrl.gridwidth = 3;
progressPaneCtrl.anchor = GridBagConstraints.CENTER;
JButton btn = new JButton("DownLoad");
GridBagConstraints btnCtrl = new GridBagConstraints();
btnCtrl.gridx = 0;
btnCtrl.gridy = 3;
btnCtrl.gridheight = 1;
btnCtrl.gridwidth = 3;
btnCtrl.insets = new Insets(18,18,18,18);
btnCtrl.anchor = GridBagConstraints.CENTER;
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent actionevent) {
final JLabel progressLabel = new JLabel();
final JProgressBar progressBar = new JProgressBar();
progressBar.setVisible(false);
panel.add(progressLabel);
panel.add(progressBar);
final String DownLoadPath = textArea.getText();
final String Topath = textField.getText();
int threadCount1 = 1;
if (threadField.getText()!=null&&!threadField.getText().trim().equals(""))
{
threadCount1 = Integer.parseInt(threadField.getText());
}
final int threadCount = threadCount1;
if (DownLoadPath==null||"".equals(DownLoadPath)) {
JOptionPane.showMessageDialog(tool, "Please input URL!");
return;
}
else if(Topath==null||"".equals(Topath)) {
JOptionPane.showMessageDialog(tool, "Please select save path!");
return;
}
else if(Topath!=null&&DownLoadPath!=null||"".equals(Topath.trim())&&"".equals(DownLoadPath.trim())) {
new Thread(){
public void run() {
progressBar.setVisible(true);
progressBar.setValue(0);
new DownLoadToolClass(progressBar,DownLoadPath,Topath,threadCount).DownLoadFile(progressLabel);
}
}.start();
}
}
});
tool.add(label,labelCtrl);
tool.add(scrollPane,scrollPaneCtrl);
tool.add(label2,label2Ctrl);
tool.add(textField,textFieldCtrl);
tool.add(Tobtn,TobtnCtrl);
tool.add(label3,label3Ctrl);
tool.add(threadField,threadFieldCtrl);
tool.add(progressPane,progressPaneCtrl);
tool.add(btn,btnCtrl);
tool.setVisible(true);
}
}
//////////////////////////////关键下载类//////////////////////////////////////
package com.company.www.me.net;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
public class DownLoadToolClass {
String DownLoadPath;
String Topath;
int threadCount;
JProgressBar progressBar;
public DownLoadToolClass(JProgressBar progressBar,String downLoadPath, String topath,int threadCount) {
this.progressBar = progressBar;
this.DownLoadPath = downLoadPath;
this.Topath = topath;
this.threadCount = threadCount;
}
public void DownLoadFile(JLabel progressLabel){
try {
int size;
int blockSize;
int EndBlockSize = -1;
URL url = new URL(DownLoadPath);
URLConnection conn = url.openConnection();
size = conn.getContentLength();
File file = new File(Topath);
RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rw");
randomAccessFile.setLength(size);
randomAccessFile.close();
if (0==size%threadCount)
blockSize = size/threadCount;
else{
blockSize = size/threadCount;
EndBlockSize = size%threadCount;
}
File file2 = new File(Topath+".wbj");
if (file2.exists()) {
file2.delete();
file2.createNewFile();
}
RandomAccessFile os = new RandomAccessFile(file2,"rw");
os.setLength(threadCount*32);
os.close();
this.progressBar.setIndeterminate(false);
this.progressBar.setMaximum(size);
for (int i = 0; i <= threadCount; i++) {
if (i==threadCount && EndBlockSize!=-1) {
if (i*blockSize<size) {
multithreadDown(this.progressBar,progressLabel,i,i*blockSize,i*blockSize + EndBlockSize);
}
}
else {
if (i*blockSize<size) {
multithreadDown(this.progressBar,progressLabel,i,i*blockSize,i*blockSize + blockSize);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void multithreadDown(final JProgressBar progressBar,final JLabel progressLabel,final int threadId,final int begin,final int end){
new Thread(){
public void run() {
RandomAccessFile os = null;
RandomAccessFile randomAccessFile = null;
try {
byte[] b = new byte[1024];
int fontCount;
String ll = begin + " " + (end - 1);
int lenght2 = 0;
File file = new File(Topath);
File file2 = new File(Topath+".wbj");
os = new RandomAccessFile(file2,"rw");
randomAccessFile = new RandomAccessFile(file,"rw");
randomAccessFile.seek(begin);
URL url = new URL(DownLoadPath);
URLConnection conn = url.openConnection();
conn.setRequestProperty("RANGE", "bytes="+begin+"-"+(end -1));
conn.connect();
InputStream is = conn.getInputStream();
while ((fontCount = is.read(b))!=-1) {
randomAccessFile.write(b,0,fontCount);
synchronized (progressBar) {
float size = progressBar.getMaximum();
int downAll = progressBar.getValue() + fontCount;
float downD = downAll;
float d = downD/size*100;
String progress;
if (String.valueOf(d).length()>4) {
progress = String.valueOf(d).substring(0, 4) +"%";
}
else {
progress = String.valueOf(d)+"%";
}
progressLabel.setText(progress);
progressBar.setValue(downAll);
if (downAll==size) {
progressBar.setVisible(false);
progressLabel.setText("Download complete");
}
}
lenght2 +=fontCount;
os.seek(threadId*32);
os.write((ll + " " + lenght2 + "\r\n").getBytes());
}
os.close();
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
Thread.currentThread().stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
}
}
java编写的Http协议的多线程下载器的更多相关文章
- <基于Qt与POSIX线程>多线程下载器的简易搭建
原创博客,转载请联系博主! 本项目已托管到本人Git远程库:https://github.com/yue9944882/Snow 项目目标 Major Functionality 开发环境: Ce ...
- 通过HTTP协议实现多线程下载
1. 基本原理,每条线程从文件不同的位置开始下载,最后合并出完整的数据. 2. 使用多线程下载的好处 下载速度快.为什么呢?很好理解,以往我是一条线程在服务器上下载.也就是说,对应在服务器上, ...
- Java多线程下载器FileDownloader(支持断点续传、代理等功能)
前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...
- Android版多线程下载器核心代码分享
首先给大家分享多线程下载核心类: package com.example.urltest; import java.io.IOException; import java.io.InputStream ...
- python10min系列之多线程下载器
今天群里看到有人问关于python多线程写文件的问题,联想到这是reboot的架构师班的入学题,我想了一下,感觉坑和考察的点还挺多,可以当成一个面试题来问,简单说一下我的想法和思路吧,涉及的代码和注释 ...
- 06-python进阶-多线程下载器练手
我们需要用python 写一个多线程的下载器 我们要先获取这个文件的大小 然后将其分片 然后启动多线程 分别去下载 然后将其拼接起来 #!/usr/bin/env python#coding:utf- ...
- Ubuntu下的图形化多线程下载器XDM
目录 1.下载 2.安装 3.浏览器支持 使用Ubuntu下载东西经常过于缓慢,因此需要多进程下载器. 1.下载 下载链接:http://xdman.sourceforge.net/#download ...
- Http协议的断点续传下载器,使用观察者模式监视下载进度,使用xml保存下载进度。
下载使用Http协议,为了做到断点续传,在点击暂停后,将已下载的大小等数据通过Json存入xml中,当继续传输的时候从xml文件中读取大小继续下载(好几个月前写的,真的想不起来了) bool CHtt ...
- Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)
1. 为什么需要多线程下载? 服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...
随机推荐
- H - Being a Good Boy in Spring Festival
一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄给爸爸买个小礼物 主动地 强烈地 要求洗一次碗 某一天早起 给爸妈用心地做回早餐 如果愿意 你还 ...
- cmus 命令行播放器使用
安装 sudo eopkg it cmus 启动 cmus 设置输出 :set output_plugin=pulse 导入本地音乐 :add /home/your_username/Music 查看 ...
- 项目启动报错java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
项目已启动的情况下,MyEclipse异常退出.再次打开后重启项目,项目报错:java.net.SocketException: Unrecognized Windows Sockets error: ...
- .NET Core开发日志——Filter
ASP.NET Core MVC中的Filter作用是在请求处理管道的某些阶段之前或之后可以运行特定的代码. Filter特性在之前的ASP.NET MVC中已经出现,但过去只有Authorizati ...
- vm tools安装linux ubuntu和主机不能复制
点击图中的安装vm tools ,因为我的已经安装过了,所以显示的是重新安装. 点击以后会出来一个虚拟光驱,打开虚拟光驱,复制出来 vm toolsxxx.tar.gz 文件建立一个临时文件夹,复制 ...
- Mybatis 不同使用方式
前言 工作这么多年,ORM框架一直选择Mybatis框架. Mybatis的使用方式也一直在变,总体来说是越来越简单.写篇文章对各使用方式做个总结... 正文 一.Mybatis典型用法 1. 正常执 ...
- BTree和B+Tree详解
https://www.cnblogs.com/vianzhang/p/7922426.html B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平 ...
- ehlib预览打印的使用
ehlib支持预览打印功能,可以省去重新制作报表的麻烦,经过一天的努力,基本上解决了这个问题.把解决方法写出来,同行的朋友可以参考,同时为自己做个学习笔记. 首先,需要放置PrintDBGri ...
- SpringMVC 的使用映射路径 <mvc:resources >
以下是测试结果,可能存在纰漏,暂记录一下. 使用springMVC时,一般将DispatcherServlet请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求 ...
- LeetCode 557 Reverse Words in a String III 解题报告
题目要求 Given a string, you need to reverse the order of characters in each word within a sentence whil ...