我正在做一个类似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下载文件相关推荐

  1. 用java线程绘制图案_关于多线程:使用线程在java中绘制面板

    我正在编写一个包含许多不同视图的程序. 其中一个是相当图形密集型(它显示一个互连的图形). 其他人只是展示小而复杂的图表. 我发现主视图的绘制时间很长(甚至只绘制当前可见的区域),并且在绘制时,界面的 ...

  2. java线程实现排序_【多线程实现快速排序】

    快速排序算法实现文件QuickSort.java package quick.sort; import java.util.concurrent.Callable; import java.util. ...

  3. java 线程间通信方式_「转」JAVA多线程之线程间的通信方式

    1. 同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public class MyObject { synchronized public void m ...

  4. java线程知乎_全网独家!知乎20K点赞的Java并发多线程笔记,简直堪称神仙级文档...

    有很多小伙伴都问过我,头条号里的关于java多线程的文章有pdf版本吗?我其实很想弄pdf,但是前段时间一直没时间去折腾,我把每个Java并发编程核心技术的都整理成了一个又一个的文档.昨天也是终于全部 ...

  5. java 子线程传参_踩坑之Java执行Linux命令死锁阻塞挂起

    1 问题背景 最近在做一个需求需要调用linux下的某个脚本来对ai的模型进行训练,很简单的需求,我像往常一样写下如下的代码片段: Process process = Runtime.getRunti ...

  6. java线程内存模型_深度解析Java多线程的内存模型

    内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...

  7. java 线程的理解_浅谈对多线程的理解(一)

    今天我们先来聊聊有关线程的话题...... 一. 线程概述 1. 简单区分程序.进程和线程 程序是指一段静态的代码 进程是指正在执行的程序,将静态的代码运行起来 线程是指正在执行程序的小单元 举个栗子 ...

  8. java 微信企业号上传文件_微信企业号上传下载多媒体文件接口详解演示-java

    讲完这篇博客,微信企业号的接口就说完了,下载了我源码的童鞋都知道,里面的备注很详细,但凡看过几遍就都会自己开发了,我说的这些接口至此我已经全部开发完了,剩下的就是你们自己写功能了,都是轻而易举的事情了 ...

  9. java 下载加速_一种基于Java的大文件下载加速方法与流程

    本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...

最新文章

  1. ipad html 自定义裁剪,canvas裁剪clip()函数的具体使用
  2. Shell脚本编写与应用
  3. QML 性能优化建议(一)
  4. 学起来 —— CSS 入门基础
  5. 【STM32】ESP8266模块简介
  6. 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新
  7. 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
  8. ASP.NET的分页方法(一)
  9. 重新发现 make: 规则背后的力量
  10. 接口 对象 = new 实现类 与 实现类 对象= new 实现类
  11. android堆叠效果相册_CSS实现照片堆叠效果
  12. Java基础-异常-throws Exception-抛声明
  13. 38. Element cloneNode() 方法
  14. Camera 初始化(Preview) 一(Framework-HAL3)
  15. 从实际游戏制作谈如何提高游戏中的打击感
  16. 青少年软件编程(Python)等级考试试卷(一级)
  17. Linux命令提示符
  18. stream流去除对象的值_I/O流(过滤流、对象序列化、字符流)
  19. MBA案例分析(人员培训五)
  20. [Angular2]eclipse中angular2开发环境的搭建

热门文章

  1. vb 打开sdf数据_DWG、DGN、SDF、DWF!Civil 3D图形数据共享的几种方法
  2. Windows系统下使用Jenkins自动化发布.NET core程序到Linux平台下利用Docker快速启动
  3. Android 生态消息推送平台介绍
  4. Linux系统下配置JDK环境变量
  5. JQuery datepicker
  6. 09、win32 转换为 store app
  7. 【转】prufer编码
  8. 奇门遁甲鸣法 第四章 正格
  9. 外挂(目前看不懂_转帖不要怪我抄袭只是想学习而已)
  10. 常见音视频编码格式一览