java基础第十九天_QQ、多线程下载

1.QQ

2.屏广软件,大数据包处理,frame缓冲区最多保持两帧画面,1s内没有集齐所有frameunit,则丢弃。

3.从互联网多线程下载

地址 : http://apache.opencas.org/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz

RandomAccessFile

Thread (>= 3)

HttpURLConnection.setRequestProperty("Range", "bytes=2097152-4194303");

GET / HTTP/1.1

Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Accept-Language: zh-CN

Cache-Control: no-cache

UA-CPU: AMD64

Range: bytes=2097152-4194303

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)

Host: www.baidu.com

Connection: Keep-Alive

getIs()

-------------------------------------------------------------------------------------------

项目源码;

package com.it18zhang.downloader;

/**

* 下载信息对象

*/

public class DownloadInfo {

private String url;

private String local;

private int startPos; //起始位置

private int endPos; //结束位置

public DownloadInfo() {

}

public DownloadInfo(String url, String local, int startPos, int endPos) {

this.url = url;

this.local = local;

this.startPos = startPos;

this.endPos = endPos;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public String getLocal() {

return local;

}

public void setLocal(String local) {

this.local = local;

}

public int getStartPos() {

return startPos;

}

public void setStartPos(int startPos) {

this.startPos = startPos;

}

public int getEndPos() {

return endPos;

}

public void setEndPos(int endPos) {

this.endPos = endPos;

}

}

package com.it18zhang.downloader;

import java.io.RandomAccessFile;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

/**

* 下载管理器

*/

public class DownloadManager {

private String url ;

private String local ;

private int count ;

//文件总长度

private int totalLength ;

private List<DownloadInfo> infos ;

private UI ui ; //ui

/**

* DownloadManager

*/

public DownloadManager(String url, String local, int count,UI ui) {

super();

this.url = url;

this.local = local;

this.count = count;

this.ui = ui ;

//准备下载

prepareDownload();

}

/*

* 准备下载

* 1.提取url文件大小

* 2.创建本地文件

* 3.准备DownloadInfo集合

*/

private void prepareDownload() {

infos = new ArrayList<DownloadInfo>();

try {

//1.提取文件大小

URL url0 = new URL(url);

this.totalLength = url0.openConnection().getContentLength();

//1‘.设置ui的进度条的最大值.

ui.setProgressbarMax(totalLength);

//2.创建本地文件

RandomAccessFile raf = new RandomAccessFile(local, "rw");

raf.setLength(totalLength);

raf.close();

//3.准备DownloadInfo集合

int block = totalLength / count;

//

DownloadInfo info = null ;

for(int i = 0 ; i < count ; i ++){

info = new DownloadInfo();

info.setUrl(url);

info.setLocal(local);

info.setStartPos(i * block);

if(i == (count - 1)){

info.setEndPos(totalLength - 1 );

}

else{

info.setEndPos((i + 1) * block - 1);

}

//

infos.add(info);

}

}

catch (Exception e) {

e.printStackTrace();

}

}

/**

* 开始下载

*/

public void start(){

for(DownloadInfo info : infos){

new DownloadThread(info, ui).start();

}

}

}

package com.it18zhang.downloader;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.URL;

import java.net.URLConnection;

/**

* 下载线程

*/

public class DownloadThread extends Thread {

private DownloadInfo info ;

private UI ui ;

public DownloadThread(DownloadInfo info,UI ui) {

this.info = info;

this.ui = ui ;

}

public void run(){

try {

URL url = new URL(info.getUrl());

URLConnection conn = url.openConnection();

//设置header的key-value

conn.setRequestProperty("Range", "bytes=" + info.getStartPos() + "-" + info.getEndPos());

//获取流

InputStream is = conn.getInputStream();

//定位本地文件

RandomAccessFile raf = new RandomAccessFile(info.getLocal(), "rw");

raf.seek(info.getStartPos());

byte[] buf = new byte[1024];

int len = 0 ;

while((len = is.read(buf)) != -1){

//

while(ui.isPausing){

try {

Thread.sleep(500);

}

catch (Exception e) {

e.printStackTrace();

}

}

raf.write(buf, 0, len);

//更新进度条

ui.updateProcessBar(len);

}

raf.close();

}

catch (Exception e) {

e.printStackTrace();

}

}

}

package com.it18zhang.downloader;

public class StartUI {

public static void main(String[] args) {

new UI();

}

}

package com.it18zhang.downloader;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JProgressBar;

import javax.swing.JTextField;

public class UI extends JFrame {

//url

private JLabel lbUrl;

private JTextField tfUrl;

//本地地址

private JLabel lbLocal;

private JTextField tfLocal;

//线程数量

private JLabel lbCount;

private JTextField tfCount;

//按钮

private JButton btnStart;

//暂停

private JButton btnPause ;

//进度条

private JProgressBar bar ;

//是否暂停

public boolean isPausing = false ;

public UI(){

ini();

}

/**

* 初始化

*/

private void ini(){

this.setBounds(0, 0, 600, 400);

this.setLayout(null);

//url 标签

lbUrl = new JLabel("url : ");

lbUrl.setBounds(0, 0, 100, 50);

this.add(lbUrl);

tfUrl = new JTextField("http://localhost:8000/jdk-7u25-linux-x86_64.tar.gz");

tfUrl.setBounds(120, 0, 400, 50);

this.add(tfUrl);

//local地址

lbLocal = new JLabel("local : ");

lbLocal.setBounds(0, 60, 100, 50);

this.add(lbLocal);

tfLocal = new JTextField("d:/xx.tar.gz");

tfLocal.setBounds(120, 60, 400, 50);

this.add(tfLocal);

//count地址

lbCount = new JLabel("Count : ");

lbCount.setBounds(0, 120, 100, 50);

this.add(lbCount);

tfCount = new JTextField("3");

tfCount.setBounds(120, 120, 400, 50);

this.add(tfCount);

//下载按钮

btnStart = new JButton("开始");

btnStart.setBounds(10, 180, 100, 50);

this.add(btnStart);

btnStart.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

String url = tfUrl.getText();

String local = tfLocal.getText();

int count = Integer.parseInt(tfCount.getText());

DownloadManager mgr = new DownloadManager(url, local, count, UI.this);

mgr.start();

bar.setVisible(true);

}

});

//暂停

btnPause = new JButton("暂停");

btnPause.setBounds(120, 180, 100, 50);

this.add(btnPause);

btnPause.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

UI.this.isPausing = !UI.this.isPausing ;

btnPause.setText(UI.this.isPausing?"继续":"暂停");

}

});

//进度条

bar = new JProgressBar();

bar.setBounds(5, 240, 550,10);

this.add(bar);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setVisible(true);

}

/**

* 更新进度条

*/

public synchronized void updateProcessBar(int len) {

int newValue = bar.getValue() + len ;

bar.setValue(newValue);

if(newValue >= bar.getMaximum()){

JDialog d = new JDialog();

d.setTitle("下载完成!");

d.setVisible(true);

d.setBounds(400, 300, 200, 100);

bar.setValue(0);

bar.setVisible(false);

}

}

public void setProgressbarMax(int length) {

bar.setMaximum(length);

}

}

package com.it18zhang.urldemo;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.URL;

import java.net.URLConnection;

public class TestApp {

public static void main(String[] args) throws Exception {

String urlStr = "http://localhost:8000/jdk-7u25-linux-x86_64.tar.gz";

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

String type = conn.getContentType();

int length = conn.getContentLength();

System.out.println(type + " : " + length);

InputStream is = conn.getInputStream();

FileOutputStream fos = new FileOutputStream("d:/jdk.gz");

byte[] buf = new byte[1024];

int len = 0 ;

while((len = is.read(buf)) != -1){

fos.write(buf, 0, len);

}

fos.close();

is.close();

}

}

时间: 2024-11-04 06:19:35

java基础第十九天_QQ、多线程下载的相关文章

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

第一题:简单的URL获取资源下载 import java.net.URL; import java.net.URLConnection; import java.io.InputStream; import java.io.FileOutputStream; class DownloadDemo{     public static void main(String[] args){         String src_url = "http://one.jiangmin.com/jiangm

Java基础--第十九天

异常分类: Exception       RuntimeException 非运行时期异常     运行时期异常 自定义异常 IO流: Java中的io流是用来处理不同设备间的输入输出问题的 io流操作的类都在io包中: io流分类: 流向分: 输入流   读取数据 输出流     写入数据 按操作数据不同: 字节流 字符流 File类: 构造方法 常见方法: 创建: createNewFile():当文件不存在时,创建文件 当没有给出指定路径时,以当前项目路径为文件创建路径. 相对路径和绝对

Java基础第二十九天总结——Java8新特性

目录: 一.Lambda表达式 二.函数式(Functional)接口 三.方法引用于构造器引用 四.强大的Stream API 五.Optional类 /*--------------------------分割线---------------------------*/ 一.Lambda表达式 速度更快 代码更少(增加了新的语法:Lambda 表达式) 强大的 Stream API 便于并行 最大化减少空指针异常:Optional Nashorn引擎,允许在JVM上运行JS应用 Lamdba

Java基础复习笔记系列 八 多线程编程

Java基础复习笔记系列之 多线程编程 1. 2.

Android(十五)多线程下载包括断点续传

1.多线程下载,java程序 package com.itheima.download; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; imp

Java基础--第二十五天

TCP协议: Socket类 构造方法: TCP程序,必须先开服务器端 成员方法 服务器端程序: 创建服务器端Socket对象: 监听连接: 获取输入流,并显示: 释放资源 ServerSocket类 网络编程 网络编程+反馈 大融合[所有的Java基础融合为一个实例] 正则表达式: 符合某种规则的字符串,常用于校验 规则: Pattern类 A:字符 x:任意字符表示任意字符本身 \\:反斜线字符[转义字符] \r:回车 \n:换行 B:字符类 [abc]:表示a,b,c任意字符一次 [^ab

Java基础笔记(四:多线程基础及生命周期)

一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类.因为类java.lang.Thread实际上也是实现了接口java.lang.Runnable的类,所以上面两种构造线程类的方法从本质上都是构造实现接口java.lang.Runnable的类.下面将具体介绍着两种方法. (1)通过类Thread的子类构造线程 类java.lang.Thread的每

java基础知识十二

第十二章 异常 异常(Exception):又称为例外,是程序在运行过程中发生的非正常事件,其发生会影响程序的正常执行.Exception是程序级错误,可由程序本身处理:Error是系统级错误,程序可不用处理.Java异常类都必须继承Throwable类或其子类.用户通过继承自定义异常.常见异常:除数为零.负数开方.数组越界.I/O异常. 抛出的异常由catch捕获,未被捕获的异常逐层传播直到main.如果main也没有处理该异常,则操作系统会终止main执行. 处理异常时,也可以抛出新异常,也

JAVA基础入门(JDK、eclipse下载安装)

最近打算从基础复习下,去年这个时间开始学习的,感觉好多都忘记了(自己记忆不深刻,容易忘事) 都是自己理解,如果有错误欢迎指正! 09年Sun公司被Oracle公司收购 javaSE:基础核心,程序开发和部署在桌面,服务器,嵌入式环境和实时环境中使用Java的应用程序: JavaEE:企业版,主要针对企业应用的开发.例如,电子商务网站.ERP系统. JavaME:微型版,主要针对消费类电子移动设备的.例如,蜂窝电话和可视电话.数字机顶盒.汽车导航系统等等. 开发环境搭建和配置 1.下载jdk并安装