java线程下载文件_使用多线程在Java下载文件
我正在做一个类似IDM的下载器,我已经读到了这篇关于它的文章。我已经实现了我的第一步代码。
下面是Downloader类的代码:package download.manager;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.ReadableByteChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Downloader implements Runnable{
private String url;
private int num;
private long start;
private long end;
ReadableByteChannel rbc;
public Downloader(String url, int num, long start, long end, ReadableByteChannel rbc) {
this.url = url;
this.num = num;
this.start = start;
this.end = end;
this.rbc = rbc;
}
@Override
public void run() {
download();
}
private void download(){
try {
System.out.println(num + " is executing");
URL file = new URL(url);
FileOutputStream stream = new FileOutputStream("tmp"+num);
stream.getChannel().transferFrom(rbc, start, end);
} catch (MalformedURLException ex) {
Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
这就是我的主要功能:package download.manager;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Behzad
*/
public class DownloadManager {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
URL file = null;
ReadableByteChannel rbc = null;
try {
String url = "http://dl1.video.varzesh3.com/video/clip93/12/video/havashi/top5_save_derby_dortmond.mp4";
file = new URL(url);
rbc = Channels.newChannel(file.openStream());
int size = file.openConnection().getContentLength();
ExecutorService pool = Executors.newFixedThreadPool(4);
int partSize = size / 4;
pool.submit(new Downloader(url, 1, 0, partSize, rbc));
pool.submit(new Downloader(url, 2, partSize, partSize, rbc));
pool.submit(new Downloader(url, 3, 2 * partSize, partSize, rbc));
pool.submit(new Downloader(url, 4, 3 * partSize, partSize, rbc));
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
} catch (MalformedURLException | InterruptedException ex) {
Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
但是当我运行这段代码时,下载程序只下载文件的第一部分。如图所示
我该为这个怎么办?
下面是更新的下载方法:private void download(){
try {
System.out.println(num + " is executing");
URL file = new URL(url);
ReadableByteChannel rbc = Channels.newChannel(file.openStream());
FileOutputStream stream = new FileOutputStream("tmp"+num);
stream.getChannel().transferFrom(rbc, start, end);
} catch (MalformedURLException ex) {
Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
}
}
java线程下载文件_使用多线程在Java下载文件相关推荐
- 用java线程绘制图案_关于多线程:使用线程在java中绘制面板
我正在编写一个包含许多不同视图的程序. 其中一个是相当图形密集型(它显示一个互连的图形). 其他人只是展示小而复杂的图表. 我发现主视图的绘制时间很长(甚至只绘制当前可见的区域),并且在绘制时,界面的 ...
- java线程实现排序_【多线程实现快速排序】
快速排序算法实现文件QuickSort.java package quick.sort; import java.util.concurrent.Callable; import java.util. ...
- java 线程间通信方式_「转」JAVA多线程之线程间的通信方式
1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...
- java线程知乎_全网独家!知乎20K点赞的Java并发多线程笔记,简直堪称神仙级文档...
有很多小伙伴都问过我,头条号里的关于java多线程的文章有pdf版本吗?我其实很想弄pdf,但是前段时间一直没时间去折腾,我把每个Java并发编程核心技术的都整理成了一个又一个的文档.昨天也是终于全部 ...
- java 子线程传参_踩坑之Java执行Linux命令死锁阻塞挂起
1 问题背景 最近在做一个需求需要调用linux下的某个脚本来对ai的模型进行训练,很简单的需求,我像往常一样写下如下的代码片段: Process process = Runtime.getRunti ...
- java线程内存模型_深度解析Java多线程的内存模型
内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...
- java 线程的理解_浅谈对多线程的理解(一)
今天我们先来聊聊有关线程的话题...... 一. 线程概述 1. 简单区分程序.进程和线程 程序是指一段静态的代码 进程是指正在执行的程序,将静态的代码运行起来 线程是指正在执行程序的小单元 举个栗子 ...
- java 微信企业号上传文件_微信企业号上传下载多媒体文件接口详解演示-java
讲完这篇博客,微信企业号的接口就说完了,下载了我源码的童鞋都知道,里面的备注很详细,但凡看过几遍就都会自己开发了,我说的这些接口至此我已经全部开发完了,剩下的就是你们自己写功能了,都是轻而易举的事情了 ...
- java 下载加速_一种基于Java的大文件下载加速方法与流程
本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...
最新文章
- ipad html 自定义裁剪,canvas裁剪clip()函数的具体使用
- Shell脚本编写与应用
- QML 性能优化建议(一)
- 学起来 —— CSS 入门基础
- 【STM32】ESP8266模块简介
- 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新
- 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
- ASP.NET的分页方法(一)
- 重新发现 make: 规则背后的力量
- 接口 对象 = new 实现类 与 实现类 对象= new 实现类
- android堆叠效果相册_CSS实现照片堆叠效果
- Java基础-异常-throws Exception-抛声明
- 38. Element cloneNode() 方法
- Camera 初始化(Preview) 一(Framework-HAL3)
- 从实际游戏制作谈如何提高游戏中的打击感
- 青少年软件编程(Python)等级考试试卷(一级)
- Linux命令提示符
- stream流去除对象的值_I/O流(过滤流、对象序列化、字符流)
- MBA案例分析(人员培训五)
- [Angular2]eclipse中angular2开发环境的搭建