package lan;
/**
* @author lan
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
public class Downloader {
private static int THREADS = 5;
/**
* @param args
*/
public static void main(String[] args) {
try {
URL url = new URL("http://43.duotegame.com/themehospital.exe");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
System.out.println("连接到" + url);
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
String name = con.getHeaderField("content-disposition");
if (name != null && name.toLowerCase().contains("filename=")) {
name = name.substring(name.indexOf("filename=") + 9);
} else {
name = con.getURL().toString();
name = name.substring(name.lastIndexOf("/") + 1);
name = URLDecoder.decode(name, "UTF-8");
}
int length = con.getContentLength();
System.out.println("开始下载:" + name + ",长度为:" + length);
RandomAccessFile raf = new RandomAccessFile("E:/down/" + name,
"rw");
FileChannel fc = raf.getChannel();
int cl = length / THREADS;
if (length == 0) {
THREADS = 1;
}
Downloader d = new Downloader();
for (int i = 0; i < THREADS; i++) {
int begin = i * cl;
int end = (i + 1) * cl;
if (i != 0) {
begin += 1;
} else if (i == THREADS - 1) {
end = length - 1;
}
d.new Downer(url, fc, begin, end).start();
}
}
con.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class Downer extends Thread {
private URL url;
private FileChannel fc;
private int start, end;
public Downer(URL url, FileChannel fc, int start, int end) {
this.url = url;
this.fc = fc;
this.start = start;
this.end = end;
}
@Override
public void run() {
try {
System.out.println(this.getName() + "开始下载" + start + "到" + end);
HttpURLConnection con = (HttpURLConnection) url
.openConnection();
con.setRequestProperty("User-Agent", "Lan Downloader");
con.setRequestProperty("Range", "bytes=" + start + "-" + end);
if (con.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) {
System.out.println("Content-Range:"
+ con.getHeaderField("Content-Range"));
System.out.println("Length:" + con.getContentLength());
InputStream is = con.getInputStream();
ReadableByteChannel rbc = Channels.newChannel(is);
ByteBuffer bb = ByteBuffer.allocate(1024 * 4);
long l = 0;
while (rbc.read(bb) != -1) {
bb.flip();
int i = fc.write(bb, start + l);
l += i;
bb.clear();
}
System.out.println(this.getName() + "下载完毕");
}
con.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
忘记加关闭了,其实还应该加上文件锁和获取文件的信息
分享到:
相关推荐
一段纯C的代码,把一个文件藏到另一个文件里 =============================================== Welcome to use EF 1.0 version Usage:EF.exe -a dstFilePath AppendFile Usage:EF.exe -n dstFilePath D:\VC\EF>ef...
3. Readme或文档文件:解释如何导入和使用这些代码段,以及可能的兼容性信息和更新日志。 使用这些官方扩充的C#代码段,开发者可以: - 快速生成常见的代码结构,如控制流、类定义、方法声明等。 - 保持代码风格...
通过以上分析可以看出,该示例代码提供了一个简单的文件下载功能实现方案,使用JSP结合SmartUpload插件来完成。这种方法不仅易于实现,而且具有较高的灵活性和可扩展性。对于需要快速添加文件下载功能的项目来说,这...
在IT领域,文件内容替换...总结起来,这段C语言源代码提供了一个通用的文件内容替换工具,其灵活性和跨平台能力使其在多种场景下都能发挥作用。理解并掌握这种实现方式对于提升C语言编程能力和文本处理技能非常有帮助。
标题 "一段简单实用的代码.zip" 提供的信息表明,这个压缩包包含的是一段或一组可用于实际应用的代码。在IT行业中,简单的实用代码通常指的是能够解决特定问题、易于理解和执行的小型代码片段。这样的代码可能涵盖...
描述中提到的一段式代码和三段式代码,是两种不同的状态机编码方式。在FPGA设计中,状态机通常用于管理系统的状态转换,根据输入信号和当前状态决定系统执行的下一步操作。状态机的编码方式有很多种,常见的有摩尔型...
- **下载过程**: 在行政部经理、战略发展部经理、技术总监和索取者的共同监督下进行下载操作,并记录在《源代码、技术文档下载情况登记表》中。 #### 五、流程详解 - **上传流程**: 1. 开发人员整理项目源代码和...
本文将详细介绍如何在ASP.NET中实现一个能够显示下载进度条的文件下载功能,并通过提供的代码片段来逐步分析其实现细节。 #### 代码解析 首先,我们来看一下这段关键代码: ```csharp public static void ...
网上的一些代码可能会有些奇怪的问题,用的是类全局变量打开文件但在多线程中并未加锁,会导致文件有一定几率出现大小和源文件不同,即使文件大小相同,MD5值也不同,中间有一段是坏的,在图片和音频中可能只是其中一...
本资源是一个基于Java语言的源代码文件模板,总共六十页,每页五十行,主要涉及到嵌入式校园网网络质量监测系统的开发。以下是相关知识点的总结: 1. Java语言基础:该源代码文件模板使用Java语言编写,涉及到Java...
在给定的压缩包文件中,我们看到一个名为"BellwareNUnit.snippet"的文件,这暗示了它可能包含与NUnit测试框架相关的代码片段。 NUnit是一个流行的开源单元测试框架,广泛用于.NET应用程序的测试。代码段资源对于...
"UE4vs代码段.zip" 文件集合就是这样一个实用资源,它包含了一些预定义的代码片段,可以帮助开发者快速实现特定功能,提高开发效率。 首先,让我们详细了解一下这些代码段的具体内容: 1. **快捷创建碰撞事件的三...
在本文件中,我们将深入探讨HaoZip1.7源代码的关键知识点,并结合其说明文档,为你带来一次全面的解析之旅。 首先,我们来看`HaoZip1.7.src.7z`这个压缩文件,它包含了HaoZip1.7的全部源代码。源代码通常由各种编程...
这段代码是Java实现的一个简单的HTTP文件下载功能,主要涉及到网络编程和文件操作。下面将详细解释其中的关键知识点: 1. **URL与HttpURLConnection**: - `URL`(Uniform Resource Locator)类是Java中用于表示...
描述中提到的"C语言写的一段程序"可能是一个简单的示例,也可能是一个具有特定功能的完整代码。作者希望这个代码对其他人有所帮助,并对社区的支持表示感谢。这种分享精神是开源和编程社区中常见的,通过共享代码,...
压缩包内的文件"一段开启摄像头的代码(BCB).txt"很可能包含了实现上述功能的源代码,而"www.pudn.com.txt"可能是从PUDN网站上下载此代码的来源记录或者其他相关资料。PUDN是一个知名的编程资源分享网站,开发者经常...
从给定的文件信息来看,标题“求简易的代码”表明了请求者正在寻找或需要一段简单的编程代码。描述部分“求简易的代码,谢谢各位老大!”进一步确认了这一需求,同时表达了请求者的礼貌和对帮助者的尊重。然而,描述中...
这段代码遍历request中的所有parts,对每个文件进行写入操作,将文件保存到服务器的指定目录下。 此外,为了提供更好的用户体验,你还可以在uploadify中添加各种事件监听器,比如onSelect、onProgress、onComplete...
在IT行业中,HTTP(超文本传输协议)是用于在Web上传输数据的主要协议,而C++是一种强大的编程语言,常用于构建系统级和高性能...通过学习和理解这段代码,开发者能够掌握在网络环境中使用C++进行高效文件下载的技能。
这段代码定义了三个规则:识别数字序列(转化为整型)、识别标识符(由字母、下划线或数字组成)以及捕获所有其他字符。当匹配到规则时,对应的C代码块会被执行,如打印出发现的标记。 在实际开发中,词法分析器的...