HttpDownloader.java

package com.buyishi;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection; public class HttpDownloader { private final String url, destFilename; public HttpDownloader(String url, String destFilename) {
this.url = url;
this.destFilename = destFilename;
} public void download(Callback callback) {
try (FileOutputStream fos = new FileOutputStream(destFilename)) {
URLConnection connection = new URL(url).openConnection();
long fileSize = connection.getContentLengthLong();
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[10 * 1024 * 1024];
int numberOfBytesRead;
long totalNumberOfBytesRead = 0;
while ((numberOfBytesRead = inputStream.read(buffer)) != - 1) {
fos.write(buffer, 0, numberOfBytesRead);
totalNumberOfBytesRead += numberOfBytesRead;
callback.onProgress(totalNumberOfBytesRead * 100 / fileSize);
}
callback.onFinish();
} catch (IOException ex) {
callback.onError(ex);
}
} public interface Callback { void onProgress(long progress); void onFinish(); void onError(IOException ex);
}
}

OkHttpDownloader.java  //基于OkHttp

package com.buyishi;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.ResponseBody; public class OkHttpDownloader { private final String url, destFilename;
private static final Logger LOGGER = Logger.getLogger(OkHttpDownloader.class.getName()); public OkHttpDownloader(String url, String destFilename) {
this.url = url;
this.destFilename = destFilename; } public void download(Callback callback) {
BufferedInputStream input = null;
try (FileOutputStream fos = new FileOutputStream(destFilename)) {
Request request = new Request.Builder().url(url).build();
ResponseBody responseBody = new OkHttpClient().newCall(request).execute().body();
long fileSize = responseBody.contentLength();
input = new BufferedInputStream(responseBody.byteStream());
byte[] buffer = new byte[10 * 1024 * 1024];
int numberOfBytesRead;
long totalNumberOfBytesRead = 0;
while ((numberOfBytesRead = input.read(buffer)) != - 1) {
fos.write(buffer, 0, numberOfBytesRead);
totalNumberOfBytesRead += numberOfBytesRead;
callback.onProgress(totalNumberOfBytesRead * 100 / fileSize);
}
callback.onFinish();
} catch (IOException ex) {
callback.onError(ex);
} finally {
if (input != null) {
try {
input.close();
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
}
} public interface Callback { void onProgress(long progress); void onFinish(); void onError(IOException ex);
}
}

MainFrame.java  //对两个工具类的测试

package com.buyishi;

import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame; public class MainFrame extends JFrame { private final JButton test1Button, test2Button;
private static final Logger LOGGER = Logger.getLogger(MainFrame.class.getName()); private MainFrame() {
super("Download Test");
super.setSize(300, 200);
super.setLocationRelativeTo(null);
super.setDefaultCloseOperation(EXIT_ON_CLOSE);
super.setLayout(new GridLayout(2, 1));
test1Button = new JButton("测试1");
test2Button = new JButton("测试2");
super.add(test1Button);
super.add(test2Button);
test1Button.addMouseListener(new MouseAdapter() {
private boolean downloadStarted; @Override
public void mouseClicked(MouseEvent e) {
if (!downloadStarted) {
downloadStarted = true;
new Thread() {
@Override
public void run() {
String url = "http://download.microsoft.com/download/A/C/9/AC924EA1-9F39-4DFD-99DF-2C1DEB922174/EIE11/WOL/EIE11_ZH-CN_WOL_WIN764.EXE";
// String url = "https://dl.360safe.com/drvmgr/360DrvMgrInstaller_net.exe";
new HttpDownloader(url, "C:/Users/BuYishi/Desktop/file1").download(new HttpDownloader.Callback() {
@Override
public void onProgress(long progress) {
LOGGER.log(Level.INFO, "{0}", progress);
test1Button.setText("Downloading..." + progress + "%");
} @Override
public void onFinish() {
LOGGER.log(Level.INFO, "Download finished");
test1Button.setText("Downloaded");
} @Override
public void onError(IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
downloadStarted = false;
}
});
}
}.start();
}
}
});
test2Button.addMouseListener(new MouseAdapter() {
private boolean downloadStarted; @Override
public void mouseClicked(MouseEvent e) {
if (!downloadStarted) {
downloadStarted = true;
new Thread() {
@Override
public void run() {
String url = "http://download.microsoft.com/download/A/C/9/AC924EA1-9F39-4DFD-99DF-2C1DEB922174/EIE11/WOL/EIE11_ZH-CN_WOL_WIN764.EXE";
// String url = "https://dl.360safe.com/drvmgr/360DrvMgrInstaller_net.exe";
new OkHttpDownloader(url, "C:/Users/BuYishi/Desktop/file2").download(new OkHttpDownloader.Callback() {
@Override
public void onProgress(long progress) {
test2Button.setText("Downloading..." + progress + "%");
} @Override
public void onFinish() {
test2Button.setText("Downloaded");
} @Override
public void onError(IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
downloadStarted = false;
}
});
}
}.start();
}
}
});
} public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
}

用Java编写的http下载工具类,包含下载进度回调的更多相关文章

  1. ftp上传下载工具类

    package com.taotao.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...

  2. 【转】Java压缩和解压文件工具类ZipUtil

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  3. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

  4. Java汉字转成汉语拼音工具类

    Java汉字转成汉语拼音工具类,需要用到pinyin4j.jar包. import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefo ...

  5. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  6. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  7. java代码行数统计工具类

    package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...

  8. Java加载Properties配置文件工具类

    Java加载Properties配置文件工具类 import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; ...

  9. Java 操作Redis封装RedisTemplate工具类

    package com.example.redisdistlock.util; import org.springframework.beans.factory.annotation.Autowire ...

  10. java后台表单验证工具类

    /** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...

随机推荐

  1. 【Luogu】P3381最小费用最大流模板(SPFA找增广路)

    题目链接 哈  学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...

  2. BZOJ 1800: [Ahoi2009]fly 飞行棋【暴力】

    Description 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. Input 第一行为 ...

  3. bzoj2324 [ZJOI2011]营救皮卡丘 费用流

    [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2653  Solved: 1101[Submit][Status][D ...

  4. NCCloud 指令示例

    http://ansrlab.cse.cuhk.edu.hk/software/nccloud/ Implementation of NCCloud in C++ (updated: August 2 ...

  5. 转 C++STL之string

    http://www.cnblogs.com/wangkangluo1/archive/2011/07/22/2114118.html string类的构造函数: string(const char ...

  6. CentOS 7.5 安装Docker 教程

    Docker简介 Docker是一个开源的容器引擎,它有助于更快地交付应用.Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理. 使用Docker可更快地打包.测试以及部署 ...

  7. Centos常用命名

    1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours: ...

  8. 邁向IT專家成功之路的三十則鐵律 鐵律一:IT人生存之道-柔

    老子在道德經裡頭曾提到:「天下之至柔,馳聘天下之至堅」,又說:「堅強者死之徒,柔弱者生之徒」.其實人在面對世間的萬事萬物都是一樣的,只是當我們學習將這個至理套用在IT的工作職場時,將可以讓我們在這條崎 ...

  9. Mysql导出导入相关操作记录

    一.使用source source sql脚本文件路径 二.使用mysqldump 命令行下具体用法如下:  mysqldump -u用户名 -p密码 -d 数据库名 表名 脚本名; 1.导出数据库為 ...

  10. [ACM] ZOJ 3725 Painting Storages (DP计数+组合)

    Painting Storages Time Limit: 2 Seconds      Memory Limit: 65536 KB There is a straight highway with ...