大数据Java基础第二十天作业

第一题:多线程下载,显示下载进度条。(暂停功能个和断点续传待开发)。
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;
        "http://blog.51cto.com/viewpic.php?refimg=" + 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){
        "http://blog.51cto.com/viewpic.php?refimg=" + 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){
		"http://blog.51cto.com/viewpic.php?refimg=" + 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;
	}
}
时间: 2024-10-23 23:30:12

大数据Java基础第二十天作业的相关文章

大数据Java基础第十二天作业

第一题:HashMap内部实现原理 HashMap存的是key => value 对的集合,每一对就是一个entry(条目),key和value存的都是对象的引用.key不能存重复的值,key的集合是keySet().value可以存重复的值,value的集合是values(). HashMap底层用的是hash(散列)算法,使的在map中查询值速度快效率高. HashMap判断对象是否相等,先判断hashcode是否相等,再判断equals值是否相等.对象相等代码:(this.hashcode

大数据Java基础第九天作业

第一题: /**  * 1.盒子最大容量120g,(当前蜂蜜量 >= 最大容量时,则蜜蜂不往里倒蜂蜜,发送通知,在消息队列等待)  * 2.小熊每一次吃50g,(当盒子蜂蜜量 < 50则不吃,发送通知,在消息队列等待)  * 3.蜜蜂自己的口袋最大量80g,蜜蜂每1s生产6g蜂蜜,当口袋容量 >= 50g时则把所有容量倒入小熊的盒子.  */ //蜜蜂类 class Bee extends Thread{     public static final int BAG_MAX = 80;

大数据Java基础第八天作业

第一题: class Car extends Thread{     private String name;     private Locked lock;     public Car(String name,Locked lock){         this.name = name;         this.lock = lock;     }     public void run(){         synchronized(lock){             System.

大数据Java基础第十八天作业

第一题:udp传输屏幕广播(低于64k). import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.net.DatagramPacket; import java.net.DatagramSocket; class ClientDemo{     public static void main(String[] args) throws Exception{  

大数据Java基础第二十一天作业

第一题:使用PreparedStament对MySql的CRUD操作. CREATE TABLE `edu_user` (   `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',   `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',   `user_age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMM

从0开始学大数据-Java基础-三元运算符/键盘录入(4)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java运算符,其中三元运算符没有做讲解,本节我们开始学习Java基础-三元运算符/键盘录入,将会围绕以下几个知识点进行展开学习: 三元运算符 键盘录入数据 一.运算符 1.三元运算符 接着上一节的话题运算符,本节讲三元运算符,在讲三元运算符之前,可能会有很多朋友会问,是不是有一元运

从零开始学大数据-Java基础-switch语句(6)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节学习了流程控制语句,本节学习switch语句. 开始之前,我们先看一下上节的练习题. 一.练习题 if语句格式的练习: 1.获取两个数据中较大的值 2.判断一个数据是奇数还是偶数,并输出 程序执行结果如下: 二.switch语句 流程控制语句的选择结构 1 选择结构(也被称为分支结构)

【全集】大数据Java基础

课程介绍 本课程是由猎豹移动大数据架构师,根据Java在公司大数据开发中的实际应用,精心设计和打磨的大数据必备Java课程.通过本课程的学习大数据新手能够少走弯路,以较短的时间系统掌握大数据开发必备语言Java,为后续大数据课程的学习奠定了坚实的语言基础. 适用人群 1.想学大数据没有语言基础的学员 2.想学大数据没有Java语言基础的学员 3.转行想学大数据的学员 4.了解Java,大数据Java知识体系不完整的学员 课程视频下载地址(视频完整,无加密) 链接:https://pan.baid

从0开始学大数据-Java基础语法(2)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java的发展史和基本操作,本节我们开始学习Java语言的基础语法,将会围绕以下几个知识点进行展开学习: 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 PS:本节先学习前面4个知识点. 1.关键字 关键字的概述 · 被Java语言赋予特定含义的单词 关键字的特点 · 组