⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 downloadmanager.java

📁 一个很不错的下载控制监视速度.时间.容量
💻 JAVA
字号:
/*
*	项目名称:JAVA下载器
*   开发环境:WINDOW200
*	开发语言:JAVA
*	开发工具:EDITPKLUS
*	作者:魏勤
*
*/

import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;


//用于实现下载逻辑的类
class Download extends Observable implements Runnable //Runnable是实现线程的接口
{

	private static final int MAX_BUFFER_SIZE=1024;
	
	//定义下载的状态
	public static final String STATUSES[]={"Downloading","Paused","Complete","Cancelled","Error"};
	public static final int DOWNLOADING=0;
	public static final int PAUSED=1;
	public static final int COMPLETE=2;
	public static final int CANCELLED=3;
	public static final int ERROR=4;
	
		
	private URL url;
	private int size;
	private int downloaded;
	private int status;

	//构造函数他是用来定义事例化类时(开以个对象)开始状态
	public Download(URL url)
	{
		this.url=url;
		size=-1;
		downloaded=0;
		status=DOWNLOADING;

		download();
	}
	
	//获得下载的地址
	public String getUrl()
	{
		return url.toString();
	}

	//获得下载文件的大小
	public int getSize()
	{
		return size;
	}

	//获得下载时的进度
	public float getProgress()
	{
		return  ((float) downloaded / size )*100;
	}

	//获得下载时的状态
	public int getStatus()
	{
		return status;
	}

	//用于暂停
	public void pause()
	{
		status=PAUSED;
		stateChanged();
	}
	//用于暂停后继续下载
	public void resume()
	{
		status=DOWNLOADING;
		stateChanged();
		download();
	}
	//用于取消下载
	public void cancel()
	{
		status=CANCELLED;
		stateChanged();
	}
	//当下载出错时调用该方法
	private void error()
	{
		status=ERROR;
		stateChanged();
	}
	//用于下载的方法
	private void download()
	{
		Thread thread=new Thread(this);
		thread.start();
	}

	//获得保存文件的名称
	private String getFileName(URL url)
	{
		String fileName=url.getFile();
		return fileName.substring(fileName.lastIndexOf('/')+1);

	}
	
	//当状态改变时调用此方法
	private void stateChanged()
	{
		setChanged();
		notifyObservers();
	}

	//具体实现下载的逻辑
	public void run()
	{
		RandomAccessFile file=null;
		InputStream stream=null;

		try
		{
			HttpURLConnection connection=(HttpURLConnection)url.openConnection();
			connection.setRequestProperty("Range","bytes="+downloaded+"-");
			connection.connect();

			if ( connection.getResponseCode()/100!=2 )
			{
				error();
			}

			int contentLength=connection.getContentLength();

			if (contentLength<1)
			{
				error();
			}

			if (size ==-1)
			{
				size=contentLength;
				stateChanged();

			}

			file=new RandomAccessFile(getFileName(url),"rw");
			file.seek(downloaded);

			stream=connection.getInputStream();

			while (status==DOWNLOADING)
			{
				byte buffer[];

				if (size-downloaded>MAX_BUFFER_SIZE)
				{
					buffer=new byte[MAX_BUFFER_SIZE];
				}
				else
				{
					buffer=new byte[size-downloaded];
				}

				//读下载文件
				int read=stream.read(buffer);
				
				
				if (read==-1)
				{
					break;
				}
				//写入定义的文件
				file.write(buffer,0,read);
				downloaded+=read;
				stateChanged();
			}

			if (status==DOWNLOADING)
			{
				status=COMPLETE;
				stateChanged();
			}
		}
		catch (Exception e)
		{
			error();
		}
		finally
		{
			if (file!=null)
			{
				try
				{
					file.close();
				}
				catch (Exception e)
				{
				}
			}
			if (stream!=null)
			{
				try
				{
					stream.close();
				}
				catch (Exception e)
				{
				}
			}
		}
	}

}

//定义进度条的类
class ProgressRenderer extends JProgressBar implements TableCellRenderer
{

	public ProgressRenderer(int min,int max)
	{
		super(min,max);
	}

	public Component getTableCellRendererComponent(
	JTable table,Object value,boolean isSelected, boolean hasFocus
	,int row,int column)
	{
		setValue((int)((Float)value).floatValue());
		return this;


	}
};

//定义一个表格模板
class DownloadTableModel extends AbstractTableModel implements Observer
{
	private static final String[] columnNames={"URL","Size","Progress","Status"};
	private static final Class[]  columnClasses={String.class,String.class,JProgressBar.class,String.class};

	private ArrayList downloadList=new ArrayList();

	public void addDownload(Download download)
	{
		download.addObserver(this);
		downloadList.add(download);

		fireTableRowsInserted(getRowCount()-1,getRowCount()-1);
	}

	public Download getDownload(int row)
	{
		return (Download)downloadList.get(row);
	}

	public void clearDownload(int row)
	{
		downloadList.remove(row);
		fireTableRowsDeleted(row,row);
	}

	public int getColumnCount()
	{
		return columnNames.length;
	}

	public String getColumnName(int col)
	{
		return columnNames[col];
	}


	public Class getColumnClass(int col)
	{
		return columnClasses[col];
	}

	public int getRowCount()
	{
		return downloadList.size();
	}	

	public Object getValueAt(int row,int col)
	{
		Download download=(Download)downloadList.get(row);
		switch (col)
		{
		case 0:
			return download.getUrl();
		case 1:
			int size=download.getSize();
			return (size==-1)?"":Integer.toString(size);
		case 2:
			return new Float(download.getProgress());
		case 3:
			return Download.STATUSES[download.getStatus()];
		
		}

		return "";
	}

	public void update(Observable o,Object arg)
	{
		int index=downloadList.indexOf(o);
		 fireTableRowsUpdated(index,index);
	}

};


//把图形化界面布局出来,并通过事件机制实现下载功能
public class DownloadManager extends JFrame implements Observer
{
	private JTextField addTextField;
	private DownloadTableModel tableModel;
	private JTable table;

	private JButton pauseButton,resumeButton,cancelButton,clearButton;

	private Download selectedDownload;
	private boolean clearing;

	public DownloadManager()
	{
		//设置窗口的标题
		setTitle("Download Manager");
		setSize(640,480);
		
		//定义怎样退出窗口
		addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				actionExit();
			}
		});

		JMenuBar menuBar=new JMenuBar();
		JMenu fileMenu=new JMenu("File");
		fileMenu.setMnemonic(KeyEvent.VK_F);
		JMenuItem fileExitMenuItem=new JMenuItem("Exit",KeyEvent.VK_X);

		fileExitMenuItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				actionExit();
			}
		});

		fileMenu.add(fileExitMenuItem);
		menuBar.add(fileMenu);
		setJMenuBar(menuBar);

		JPanel addPanel=new JPanel();
		addTextField=new JTextField(30);
		addPanel.add(addTextField);

		//事例化下载按扭
		JButton addButton=new JButton("Add Download");
		//当点击按扭时开始下载
		addButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{
				actionAdd();
			}
		});

		addPanel.add(addButton);

		tableModel=new DownloadTableModel();
		table=new JTable(tableModel);

		table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
		{
			public void valueChanged(ListSelectionEvent e)
			{
				tableSelectionChanged();
			}
		});


		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		ProgressRenderer renderer=new ProgressRenderer(0,100); 
		renderer.setStringPainted(true);
		table.setDefaultRenderer(JProgressBar.class,renderer);

		table.setRowHeight(
			(int)renderer.getPreferredSize().getHeight()
			);

		JPanel downloadsPanel=new JPanel();
		downloadsPanel.setBorder(
		BorderFactory.createTitledBorder("Downloads"));
		downloadsPanel.setLayout(new BorderLayout());
		downloadsPanel.add(new JScrollPane(table),BorderLayout.CENTER);

		JPanel buttonsPanel=new JPanel();
		//事例化暂停按扭
		pauseButton=new JButton("Pause");
		//当点击按扭时开始暂停
		pauseButton.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					actionPause();
				}
			}
		);

		pauseButton.setEnabled(false);
		buttonsPanel.add(pauseButton);
		
		//事例化继续下载按扭
		resumeButton=new JButton("Resume");
		//当点击按扭时开始继续下载
		resumeButton.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					actionResume();
				}
			}
		);

		resumeButton.setEnabled(false);
		buttonsPanel.add(resumeButton);
		//事例化取消按扭
		cancelButton=new JButton("Cancel");
		//当点击按扭时取消下载
		cancelButton.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					actionCancel();
				}
			}
		);

		cancelButton.setEnabled(false);
		buttonsPanel.add(cancelButton);

		//事例化清空按扭
		clearButton=new JButton("Clear");
		//当点击按扭时清空下载记录
		clearButton.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					actionClear();
				}
			}
		);

		clearButton.setEnabled(false);
		buttonsPanel.add(clearButton);

		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(addPanel,BorderLayout.NORTH);
		getContentPane().add(downloadsPanel,BorderLayout.CENTER);
		getContentPane().add(buttonsPanel,BorderLayout.SOUTH);
		

		
	}


	private void actionExit()
	{
		System.exit(0);
	}

	//开始下载
	private void actionAdd()
	{
		URL verifiedUrl=verifyUrl(addTextField.getText());
		if(verifiedUrl!=null)
		{
			tableModel.addDownload(new Download(verifiedUrl));
			addTextField.setText("");
		}
		else
		{
			JOptionPane.showMessageDialog(this,"Invalid Download URL","Error",JOptionPane.ERROR_MESSAGE);
		}
	}

	private URL verifyUrl(String url)
	{
		if (!url.toLowerCase().startsWith("http://"))
		{
			return null;
		}

		URL verifiedUrl=null;
		try
		{
			verifiedUrl=new URL(url);
		}
		catch (Exception e)
		{
			return null;
		}

		if (verifiedUrl.getFile().length()<2)
		{
			return null;
		}

		return verifiedUrl;
	}


	private void tableSelectionChanged()
	{
		if (selectedDownload!=null)
		{
			selectedDownload.deleteObserver(DownloadManager.this);
		}

		if (!clearing)
		{
			selectedDownload=tableModel.getDownload(table.getSelectedRow());
			selectedDownload.addObserver(DownloadManager.this);
			updateButtons();
		}
	}

	
	//用于暂停的方法
	private void actionPause()
	{
		selectedDownload.pause();
			updateButtons();
	}
	//用于继续下载的方法
	private void actionResume()
	{
		selectedDownload.resume();
			updateButtons();
	}
	//用于取消下载的方法
	private void actionCancel()
	{
		selectedDownload.cancel();
			updateButtons();
	}
	//用于清空下载记录的方法
	private void actionClear()
	{
		clearing=true;
		tableModel.clearDownload(table.getSelectedRow());
		clearing=false;
		selectedDownload=null;
		updateButtons();
	}

//设置按扭的状态 
	private void updateButtons()
	{
		if (selectedDownload!=null)
		{
			int status=selectedDownload.getStatus();
			switch (status)
			{
			case Download.DOWNLOADING:
				pauseButton.setEnabled(true);
				resumeButton.setEnabled(false);
				cancelButton.setEnabled(true);
				clearButton.setEnabled(false);
					break;
			  case Download.PAUSED:
				pauseButton.setEnabled(false);
				resumeButton.setEnabled(true);
				cancelButton.setEnabled(true);
				clearButton.setEnabled(false);
					break;
			case Download.ERROR:
				pauseButton.setEnabled(false);
				resumeButton.setEnabled(true);
				cancelButton.setEnabled(false);
				clearButton.setEnabled(true);
					break;

			default:
				pauseButton.setEnabled(false);
				resumeButton.setEnabled(false);
				cancelButton.setEnabled(false);
				clearButton.setEnabled(true);
				break;
			
			}
		}

		else 
		{
				pauseButton.setEnabled(false);
				resumeButton.setEnabled(false);
				cancelButton.setEnabled(false);
				clearButton.setEnabled(false);
		}
	}


	public void update(Observable o,Object arg)
	{
		if (selectedDownload!=null&& selectedDownload.equals(o))
		{
			updateButtons();
		}
	}

	
	public static void main(String[] args)
	{
		
			new  DownloadManager().show();
	}

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -