基于HTTP的单线程文件下载功能实现
2016-12-08 19:32
411 查看
思路
使用http请求远程文件地址从响应体中获取文件头信息
读取响应体中的输入流,并写入本地文件输出流中
代码实现
package org.hanmeis; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Scanner; import java.util.Timer; import java.util.TimerTask; import java.util.logging.Logger; /** * Created by zhao.wu on 2016/12/7. * 单线程下载 * 使用方法:SingleDownloader [url] */ public class SingleDownloader { private static Logger logger = Logger.getLogger("SingleDownloader"); public static void main(String[] args) throws IOException { String url; if(args.length<1){ System.out.print("输入下载地址:"); url = new Scanner(System.in).nextLine(); }else { url = args[0]; } //校验参数合法性 略 SingleDownloader singleDownloader = new SingleDownloader(url); singleDownloader.connectServer(); singleDownloader.startDownload(); } private URL url; private String fileName; private long fileSize; private long preSize; private long currentSize; private InputStream is; private OutputStream os; private Timer timer = new Timer(); private SingleDownloader(){ logger.info("新任务加入下载队列......"); } private SingleDownloader(String url) throws MalformedURLException { this(); this.url = new URL(url); } /** * 连接远程服务器,并获取文件信息:大小,文件名 * @throws IOException */ private void connectServer() throws IOException { logger.info(String.format("连接服务器:%s://%s",url.getProtocol(),url.getHost())); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(10*1000); this.fileSize = Long.parseLong(connection.getHeaderField("Content-Length")); String[] temp = url.getFile().split("/"); if(temp.length!=0) { this.fileName = temp[temp.length - 1]; } this.is = connection.getInputStream(); this.os = new FileOutputStream(this.fileName); logger.info(String.format("文件名:%s 大小:%.2fM", this.fileName, this.fileSize*1.0/1024/1024)); } /** * 下载过程 * @throws IOException */ private void startDownload() throws IOException { logger.info(String.format("开始下载:%s",fileName)); info(); byte[] bs = new byte[5120]; int len; while((len = is.read(bs))>0){ os.write(bs); this.currentSize += len; } is.close(); os.close(); timer.cancel(); logger.info(String.format("完成下载:%s",fileName)); } /** * 定时计算下载状态 */ private void info(){ timer.schedule(new TimerTask() { @Override public void run() { long tempC = currentSize; long tempSize = tempC-preSize; preSize = tempC; double percent = (tempC*100.0)/fileSize; double speed = (tempSize*1.0)/1024/3; logger.info(String.format("文件:%s 已完成:%.2f%% 速率:%.2fkb/s",fileName, percent, speed)); } },0, 3000); } }
相关文章推荐
- 基于HTTP的多线程文件下载功能实现
- AngularJS基于http请求实现下载php生成的excel文件功能示例
- 基于Java文件输入输出流实现文件上传下载功能
- 基于NoHttp+RxBus+MVP实现网络文件下载(带进度条)
- windows基于阿帕奇服务器,实现vc++文件下载功能
- Java servlet 简单实现http文件下载断点续传功能
- Winfrom 线程实现 http、https 文件下载 显示下载进度详情
- ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)
- 基于RandomAccessFile实现断点文件下载功能
- Golang+Android基于HttpURLConnection实现的文件上传功能示例
- 基于struts 的实现文件的下载和删除功能
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- 基于NoHttp+RxBus实现文件下载(带下载进度)
- java resteasy restful webservice教程(六):实现文件下载功能实例文章来源:爱上123 原文地址:http://www.ishang123.com/jishubowen/
- 基于C/S结构后门下载文件的功能模
- ASP.NET 2.0 HttpHandler实现对某种文件类型权限保护(示例代码下载)
- 闲来无事之--记用BAT(批处理脚本)实现文件下载功能(续)
- 用HttpListener实现文件下载
- 模式窗口中实现文件下载功能
- Java实现HTTP文件下载