java多线程下载
类DownLoad,main类
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.TextArea;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.awt.CheckboxGroup;
public class DownLoad extends JFrame implements ActionListener{
/**
* @param args
*/
private JPanel contentPane;
private JPanel progressPane;
private JTextField textField1=new JTextField();
private JTextField textField2=new JTextField();
private JButton button=new JButton();
private JButton open = new JButton("打开");
private JButton stop = new JButton("停止");
private JComboBox nThreadBox;
private JCheckBox proxybutton = new JCheckBox();
private JLabel label1=new JLabel();
private JLabel label2=new JLabel();
private JLabel label3=new JLabel("设置代理 : ");
private JLabel label4=new JLabel("下载进度:");
private JLabel label5=new JLabel("线程数:");
private JTextArea textArea=new JTextArea();
private JProgressBar jProgressBar = newJProgressBar();
private int nTread = 5;
static String host = "";
static String port = "";
DownLoadFile downFile;
public DownLoad(){
contentPane = (JPanel)this.getContentPane();
contentPane.setLayout(null);
this.setSize(new Dimension(380,400));
this.setLocation(100,100);
this.setTitle("多线程下载");
textField1.setBounds(newRectangle(150,200,200,20));
textField1.setText("http://");
textField2.setBounds(newRectangle(150,240,120,20));
textField2.setText("d:\\code.rar");
label1.setBounds(new Rectangle(20,200,120,20));
label1.setText("下载的目标文件为: ");
label2.setBounds(new Rectangle(20,240,120,20));
label2.setText("下载的文件另存为: ");
open.setBounds(280, 240, 60, 20);
open.addActionListener(this);
button.setBounds(new Rectangle(20,280,60,20));
button.setText("下载");
button.addActionListener(this);
stop.setBounds(100, 280, 60, 20);
stop.addActionListener(this);
label3.setBounds(165, 280, 80, 20);
proxybutton.setBounds(225, 280, 20, 20);
proxybutton.addActionListener(this);
nThreadBox= new JComboBox(newString[]{"1","2","3","4","5","6","7","8","9","10"});
label5.setBounds(250, 280, 60, 20);
nThreadBox.setBounds(300, 280, 40, 20);
nThreadBox.addActionListener(this);
contentPane.add(textField1,null);
contentPane.add(textField2,null);
contentPane.add(label1,null);
contentPane.add(label2,null);
contentPane.add(open,null);
contentPane.add(button,null);
contentPane.add(stop,null);
contentPane.add(label3,null);
contentPane.add(proxybutton,null);
contentPane.add(label5);
contentPane.add(nThreadBox);
//contentPane.add(textArea,null);
textArea.setEnabled(false);
textArea.setForeground(Color.black);
JScrollPane scrollPane = newJScrollPane(textArea);
scrollPane.setBounds(newRectangle(20,20,330,170));
contentPane.add(scrollPane,null);
progressPane = new JPanel();
progressPane.setBounds(20, 320,330,100);
//jProgressBar.setsetSize(100, 100);
//label4.setBounds(10, 320, 60, 20);
//jProgressBar.setBounds(70, 320, 140, 20);
// jProgressBar.setSize(100, 40);
progressPane.add(label4,null);
progressPane.add(jProgressBar,null);
contentPane.add(progressPane);
// progressPane.add(stop);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// this.pack();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DownLoad download = new DownLoad();
download.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == open){
JFileChooser fc=new JFileChooser();
if(fc.showSaveDialog(this)==fc.APPROVE_OPTION){
File f=fc.getSelectedFile() ;
textField2.setText(f.getAbsolutePath()) ;
}
}
if(e.getSource() == button){
//progressPane.add(new JButton("nihao"));
String URL = textField1.getText();
String saveURL = textField2.getText();
if(URL.compareTo("")==0 &&saveURL.compareTo("")==0)
{
textArea.setText("请输入要下载的文件和保存文件完整地址");
}
else
{
try
{
downFile=new DownLoadFile(URL,saveURL,textArea,nTread,jProgressBar);
downFile.start();
textArea.append("主线程启动、、、");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
if(e.getSource() == nThreadBox){
String item = nThreadBox.getSelectedItem().toString();
System.out.println("item is :"+item);
nTread = Integer.parseInt(item);
}
if(e.getSource() == stop){
downFile.stop();
textArea.append("\n 停止下载!!");
}
if(e.getSource() == proxybutton){
if(proxybutton.isSelected()){
//proxybutton.get
textArea.append("\n 代理服务被选择");
Point point=this.getLocation();
int x = this.getHeight()/2+point.x;
int y = this.getWidth()/2+point.y;
ProxyPanel proxypanel=new ProxyPanel(x,y);
/*System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost",host);
System.getProperties().put("proxyPort",port);*/
}else{
textArea.append("\n 取消代理服务");
System.getProperties().clear();
}
}
}
}
--------------------------------------------------------------------------------------------------------------------------------
类DownLoadFile
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, StringsaveURL, 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 = newLownLoadFileThread[startPos.length];
jProgressBar.setMaximum(100);
jProgressBar.setMinimum(0);
// jProgressBar.isStringPainted();
jProgressBar.setStringPainted(true);
jProgressBar.setString("0%");
// progressPane.add(jProgressBar);
for (inti = 0; i < startPos.length; i++) {
downFileSplitter[i] = newLownLoadFileThread(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")){
intlength=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;
}
}
-------------------------------------------------------------------------------------------------------------------------------
类LownLoadFileThread
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LownLoadFileThread extends Thread{
private JProgressBar jProgressBar;
String URL;
long startPos;
long endPos;
int threadID;
JTextArea textArea=new JTextArea();
RandomAccessFile file;
private int readPos = 0;
private int in = 0;
public LownLoadFileThread(String URL,long startPos,longendPos,int id,JTextArea textArea
,JProgressBar jProgressBar,StringsaveURL)throws IOException{
this.jProgressBar = jProgressBar;
this.URL = URL;
this.startPos = startPos;
this.endPos = endPos;
this.threadID = id;
this.textArea = textArea;
file=newRandomAccessFile(saveURL,"rw");
file.seek(startPos);
}
public void run(){
//DownLoad download = new DownLoad();
try{
URL url = new URL(URL);
HttpURLConnectionhttpConnection=(HttpURLConnection)url.openConnection();
String sProperty="bytes="+startPos+"-";
httpConnection.setRequestProperty("RANGE",sProperty);
// System.out.println("线程"+threadID+"下载文件、、、请等待");
textArea.append("\n 线程"+threadID+"下载文件、、、请等待");
InputStreaminput=httpConnection.getInputStream();
byte[] buf=new byte[1024];
int offset;
offset=(int)endPos-(int)startPos;
if(offset>1024)
offset=1024;
while((in =input.read(buf,0,offset))>0 && startPos<endPos)
{ if(((int) endPos -(int) startPos)<1024)
in = (int) endPos - (int) startPos;
/*if(in<1024){
System.out.println("in is:"+in+" -- startpos is "+startPos);
}*/
readPos +=in;
//System.out.println("已读取"+in+"个字节。");
textArea.append("\n 线程"+threadID+" 已读取"+readPos+"个字节, start is :"+startPos+" and end is:"+endPos+"。");
offset =(int) endPos - (int) startPos;
if (offset> 1024)
offset = 1024;
//System.out.println("threadID: "+threadID+" started:"+startPos+" offset: "+offset);
file.write(buf,0,in);
startPos+=in;
}
// System.out.println("线程"+threadID+"下载完毕!!");
textArea.append("\n 线程"+threadID+"下载完毕!!");
file.close();
input.close();
}catch(Exception ex){
}
}
public int getReadPos() {
return readPos;
}
public void setReadPos(int readPos) {
this.readPos = readPos;
}
}
-------------------------------------------------------------------------------------------------------------------------------
类ProxyPanel
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ProxyPanel extends JFrameimplements ActionListener {
private String host = "000.000.000.000";
private String port = "0000";
private JLabel label1 = newJLabel("主机:");
private JLabel label2 = newJLabel("端口:");
private JTextField hosttext = newJTextField();
private JTextField porttext = newJTextField();
private JButton button = newJButton("确定");
public ProxyPanel(int x, int y) {
// setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
JPanel panel = new JPanel();
panel.setLayout(null);
label1.setBounds(20, 20, 40, 20);
hosttext.setBounds(60, 20, 140, 20);
panel.add(label1, null);
panel.add(hosttext, null);
hosttext.setText(host);
label2.setBounds(20, 60, 40, 20);
porttext.setBounds(60, 60, 140, 20);
panel.add(label2);
panel.add(porttext);
porttext.setText(port);
button.setBounds(85, 100, 60, 20);
button.addActionListener(this);
panel.add(button);
getContentPane().add(panel);
setSize(new Dimension(240, 160));
setVisible(true);
setLocation(x, y);
}
public String getHost() {
return this.host;
}
public String getPort() {
return this.port;
}
public void actionPerformed(ActionEventarg0) {
// TODO Auto-generated method stub
if (arg0.getSource() == button) {
host = hosttext.getText();
//System.out.println(host);
port = porttext.getText();
//System.out.println(port);
System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost", host);
System.getProperties().put("proxyPort", port);
this.hide();
this.setDefaultCloseOperation(HIDE_ON_CLOSE);
}
}
}
由于时间原因,很遗憾没有实现断点续传的功能,等以后该功能加上后,再上传.界面可能有点难看,不过你可以用java的look&feel来定制任何好看的界面.
很不好意思,上次把类ProxyPanel给弄掉了,现在给加上去了.
相关推荐
Java多线程下载技术是Java开发中用于提升大文件下载效率的一种常见方法。在传统的单线程下载过程中,网络请求可能会因为各种原因中断,如网络波动、服务器问题或用户操作等,这会导致需要从头开始下载,浪费时间和...
Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个部分并同时下载,显著提高了下载速度。在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O...
Java多线程下载技术主要应用于提高大文件下载的效率,通过将文件分割成多个部分,同时启动多个线程分别下载这些部分,从而实现并行下载,加快下载速度。以下是对这个主题的详细解释: 1. **Java多线程基础**: 在...
在Java编程中,多线程是一项关键技能,尤其在处理并发任务时,如我们的示例——"Java多线程下载网络图片"。这个场景展示了如何利用多线程技术提高程序性能,减少用户等待时间,同时优化系统资源的使用。下面我们将...
Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个小部分,然后创建多个线程同时下载这些部分,以提高下载速度。这种技术在处理大文件或者网络带宽有限的情况下尤其有用,...
Java多线程下载工具,其核心思想是利用Java的并发特性来提高文件下载速度,模拟类似迅雷的高效下载体验。在实现这样的工具时,我们需要理解并掌握以下几个关键知识点: 1. **线程与并发**:Java中的多线程是通过`...
本文将深入解析Java多线程下载文件的关键技术和实现细节。 #### 一、Java多线程下载原理 多线程下载的核心思想是将一个大文件分割成多个小的部分,每个部分由一个独立的线程进行下载,最后将这些部分合并成完整的...
在这个场景中,"java多线程下载图片"意味着我们将探讨如何使用Java来实现一个能够异步下载多个图片的系统。 首先,我们需要理解Java中的线程是如何创建和运行的。Java提供了两种创建线程的方式:继承Thread类和实现...
Java多线程下载是利用Java编程语言实现的一种高效下载大文件的技术。在传统的单线程下载方式中,如果网络环境不稳定或文件较大,下载过程可能会很慢,甚至中断。而多线程下载则是将文件分割成多个部分,每个部分由一...
在Java编程中,多线程下载是一种常见的优化技术,它能提高大文件下载的效率,通过将文件分割成多个部分并同时下载,可以显著减少总体下载时间。以下是一个基于Java实现多线程下载的基本概念和关键点: 1. **线程...
Java多线程下载是编程中一个实用且复杂的技术点,主要应用于提高文件下载速度和优化资源利用。在大型网络应用中,多线程技术能够显著提升用户体验,尤其是在处理大文件或者多个并发请求时。本篇将围绕Java实现多线程...
这个Java多线程下载网站项目结合了网络编程、HTML解析、文件操作等多个Java核心概念,对于提升Java程序员的全栈开发能力具有很高的实践价值。通过学习和实践这个项目,开发者不仅可以掌握多线程下载的技巧,还能深入...
下面将详细讲解Java多线程下载的相关知识点: 1. **线程基础**:在Java中,线程是程序中的执行流。`Thread`类是所有线程的基类,我们可以通过继承它或实现`Runnable`接口来创建线程。创建线程主要有两种方式:直接...
Java多线程下载课程设计是一项常见且实用的项目,它涉及到计算机网络、操作系统以及Java编程语言的核心特性。在这个工程源码中,开发者可能利用了Java的并发能力来提高下载效率,实现了多线程同时下载文件的不同部分...
这是一个用于java多线程下载的帮助类 封装了多线程下载的方法
总之,这个Java多线程下载工具是一个结合了网络协议、多线程技术和文件处理的实用程序,它通过并发下载和断点续传特性,提供了高效且灵活的文件下载体验。对于学习Java并发编程、网络编程和文件操作的开发者来说,这...
Java多线程下载工具是一种利用Java编程语言实现的软件,它可以将大文件分割成多个部分并行下载,从而显著提高下载速度。这种技术是通过利用Java的多线程特性来实现的,对于处理网络资源的大量请求,尤其是在带宽有限...
在这个“另外一个java多线程下载程序源代码”中,我们可以深入学习如何利用Java的多线程特性来创建一个高效的文件下载应用。 首先,我们了解Java中创建线程的两种主要方式: 1. 继承`Thread`类:自定义一个新的类...
在Java编程中,多线程下载是一种常见的优化技术,它能有效地提高文件下载速度,特别是在处理大文件或网络带宽有限的情况下。...同时,这也是一个很好的实践案例,可以帮助你深入理解Java多线程编程和文件操作的知识。