大二末了,选好了方向,而去也喜欢网络并发,多线程之类的,就决定做个多线程下载器,学习学习文件,网络,线程间通讯的方法。

代码其实早就开始写,只是一直比较忙,也没写多少。今天认真花了一天把下载线程写了。

这个主要问题是下载文件的配置信息的写入,刚开始没有计算好seek()的参数,两个数之间总是差一截空白,找一两个点,发现seek是字节,而且JAVA写入的字母数字都是2字节一个的。下面是下载线程的代码。pause是传进去的参数,控制暂停的,暂停实际上就是停止此线程。

最近一直在忙着另一个比赛,没有时间完善,先把做好的部分代码贴上来吧,目前的主要问题就是断点续传那个文件总是写出错。

package downloadThread;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/*import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;//udp
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;//tcp
*/
public class DownloadBlock implements Runnable {
/**
* 下载需要的信息。
*/
private long begin= 0 ;
private long end= 0 ;
private int threadID= 0 ;
private String filePath;
/**
* 下载状态。
*/
private URL url;
//缓存空间
private final int BUFFER_SIZE = 1024*8;
private long currentPosition= 0 ;
/**
* 下载暂停与否,1表示继续下载,0表示暂停
* */
volatile private Integer pause;
//Http连接
HttpURLConnection conn = null;
//从Http处获得输入流
InputStream in = null;
//目标文件
RandomAccessFile accessFile = null;
//下载文件配置信息,前1kb存放链接,
RandomAccessFile cfg = null;
//构造函数的所有参数应该已经被验证过
public DownloadBlock(URL url, long begin, long end, String filePath,
int threadID,Integer pause) {
super();
this.url = url;
this.begin = begin;
this.end = end;
this.filePath = filePath;
this.threadID = threadID;
this.pause = pause;
}
/*private String getFileExtName(String path) {
return path.substring(path.lastIndexOf("."));
} */
public void run() {
currentPosition= 0 ;
//NIO模式下的UDP实现暂停
/*InetSocketAddress socketAddress = new InetSocketAddress(port);//没有指名ip表示是本机
DatagramChannel server = null; //udp类型
ByteBuffer buf = ByteBuffer.allocate(10);//接受命令缓冲区
*/            try {
//Selector select = Selector.open();
//变量赋值
final File file = new File(filePath);
final File fileCFG = new File(filePath+".cfg");
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(2000);// 请求超时时间
conn.setRequestMethod("GET");
// TODO Auto-generated method stub
conn.setRequestProperty("Range", "bytes=" + begin
+ "-" + end + "");// 设置一般请求属性 范围
//网络输入准备
in = conn.getInputStream();
byte[] data = new byte[BUFFER_SIZE];
int len = 0;
accessFile = new RandomAccessFile(file, "rwd");
//跳过指定《字节》
accessFile.seek(begin);
cfg = new RandomAccessFile(fileCFG, "rwd");
//  链接 + MD5 + 线程数 + 每个线程负责下载的最后一个块 +每个线程的当前块
cfg.seek((1024+64+64+64*2*threadID)*2);//每个信息64字节,并在下载时写入
//记录下此线程的最后一个块
cfg.writeChars(iTochars(end, 64));
while (pause.intValue()==1&&(len = in.read(data)) != -1) {
accessFile.write(data, 0, len);
currentPosition += len;
//记录下此线程当前的下载位置,为暂停做准备
cfg.seek((1024+64+64+64*2*threadID + 64)*2);
cfg.writeChars(iTochars(currentPosition, 64));
}
if(currentPosition==end)System.out.println("线程:" + threadID + "下载完成!");
else if(len!=-1)System.out.println("线程"+threadID+"已经暂停");
else System.out.println("线程"+threadID+"出现意外终止");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
try {
accessFile.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private String iTochars(long num,int n){
char a[] = ((new Long(num)).toString()).toCharArray();
char b[] = new char[n];
int l =  n - a.length;
int i ,j;
//System.out.println(a);
for(i=0;i<l;i++)
{
b[i]='0';
}
for(j=0;j<a.length;j++)
{
b[j+i] = a[j];
}
return new String(b);
}
public static void main(String[] args)
{
try{
//控制是否暂停的。
Integer pause = new Integer(1);
URL url = new URL("http://download.bloxy.cn/BloxySetup_1.4.3.3.exe");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
DownloadBlock a = new DownloadBlock(url,0,conn.getContentLengthLong(),"C:\\Users\\NSUS\\Desktop\\BloxySetup.exe",1,pause);
Thread t = new Thread(a);
t.start();
}catch(Exception e){
e.printStackTrace();
}
}
}

JAVA多线程下载器相关推荐

  1. Java多线程下载器(简洁版)

    Java多线程下载器 https://github.com/rawchen/JDownloader/archive/refs/heads/master.zip 五一无聊搞出来的,虽然已存在IDM.XD ...

  2. java 多线程下载器_Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

  3. Java swing 带界面和进度条的多线程下载器实现

    前言 因为大作业要做浏览器,浏览器要带下载器,所以现在先实现一个带界面的多线程下载器类. 多线程下载器原理 之前写过一个的[Java URLConnection类 实现多线程下载文件],只是那个dem ...

  4. Golang多线程下载器(附代码、可执行文件)

    个人学习记录,欢迎提出不足之处~ 文章目录 1. 功能介绍(使用方法) 2. 完整代码(带少量注释) 3. 可执行文件(exe) 4. 下载器实现思想(待续) 5. 代码详细解析(待续) 1. 功能介 ...

  5. 转:使用Python写一个m3u8多线程下载器

    转载:使用Python写一个m3u8多线程下载器 可去看原文:https://blog.csdn.net/muslim377287976/article/details/104340242 文章目录 ...

  6. 多线程下载器 IDM

    多线程下载器 IDM

  7. 安卓day29网络编程 HttpClient AsyncHttpClient 断点续传多线程下载器 HttpUtils

    一.排坑 HttpClient.Header飘红 Android 6.0 已经移除了httpClient module下的build.gradle中加入: android{useLibrary 'or ...

  8. Java多线程下载文件

    Java多线程下载文件 优化:合理利用服务器资源,将资源利用最大化,加快下载速度 一般有两种方式: 线程池里面有N个线程,多线程下载单个文件,将网络路径的文件流切割成多快,每个线程下载一小部分,然后写 ...

  9. 浏览器插件配合高速多线程下载器

    **以前写过关于mac百度网盘不限速的文章,后来又接触了win上的几款多线程下载器对以前的不限速方式有了更深的理解. 我目前所知的有三款高速多线程下载器,并且都需要配合对应的浏览器插件使用:** ID ...

最新文章

  1. (二)深入浅出图解Git,入门到精通(保姆级教程)
  2. ETL异构数据源Datax_图形化数据同步_11
  3. html中列表、表格、合并单元格
  4. vue 图片被背景色覆盖_如何使用纯css3打造有点意思的故障艺术(附React/Vue加强组件版)...
  5. 特斯拉已在中国建立数据中心
  6. Android studio ,Gradle 添加so库
  7. [转]C#正则表达式小结
  8. 十大排序算法——插入排序法(C语言)
  9. 菜鸟第一次使用pycharm+mysql+django运行项目
  10. Tracking 1.3 Online Trackers
  11. dxp中发光二极管在哪找_DXP2004 元件库中常用元件
  12. 【用Java模拟KTV点歌系统】
  13. SpringBoot项目深度优化和Jvm调优
  14. 学生用计算机中怎样输入分数,职称计算机考试Excel中输入分数技巧
  15. 程序员必备:常见的安卓开发工具推荐
  16. 表空间相关命令及查询SQL
  17. 【架构师技能篇】Worker初识
  18. 高性能定时器--时间轮/多级时间轮
  19. html 文字输出语音,网页上通过JS实现文本的语音朗读
  20. 可达性分析算法-针对的对象

热门文章

  1. 6个你必须用到AJAX的地方与6个不必用到的地方(转载)
  2. vscode 未找到 任何定义定义
  3. win0php环境搭建,win10php环境搭建详细教程
  4. 代码洁癖系列(五):外在的格式美
  5. 2022-4-9 Leetcode 917.仅仅反转字母
  6. 2021-11-30 红黑树深度探索
  7. 武汉理工大学数值分析课内实验
  8. window脚本自动发邮件
  9. linux命令diff实例,举例说明Linux diff 命令
  10. c语言实现伽罗华域乘法器,[2018年最新整理]伽罗瓦域GF(2^128)乘法器的设计.doc