`
i2534
  • 浏览: 182843 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一段简易的文件下载代码

    博客分类:
  • util
阅读更多
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的代码,把一个文件藏到另一个文件里

    一段纯C的代码,把一个文件藏到另一个文件里 =============================================== Welcome to use EF 1.0 version Usage:EF.exe -a dstFilePath AppendFile Usage:EF.exe -n dstFilePath D:\VC\EF&gt;ef...

    C# 代码段 官方扩充的代码段

    3. Readme或文档文件:解释如何导入和使用这些代码段,以及可能的兼容性信息和更新日志。 使用这些官方扩充的C#代码段,开发者可以: - 快速生成常见的代码结构,如控制流、类定义、方法声明等。 - 保持代码风格...

    JSP下载文件源代码

    通过以上分析可以看出,该示例代码提供了一个简单的文件下载功能实现方案,使用JSP结合SmartUpload插件来完成。这种方法不仅易于实现,而且具有较高的灵活性和可扩展性。对于需要快速添加文件下载功能的项目来说,这...

    实现文件内容替换的一段C语言源代码

    在IT领域,文件内容替换...总结起来,这段C语言源代码提供了一个通用的文件内容替换工具,其灵活性和跨平台能力使其在多种场景下都能发挥作用。理解并掌握这种实现方式对于提升C语言编程能力和文本处理技能非常有帮助。

    一段简单实用的代码.zip

    标题 "一段简单实用的代码.zip" 提供的信息表明,这个压缩包包含的是一段或一组可用于实际应用的代码。在IT行业中,简单的实用代码通常指的是能够解决特定问题、易于理解和执行的小型代码片段。这样的代码可能涵盖...

    FPGA花式流水灯,分别用一段式代码和三段式代码书写,含TB文件

    描述中提到的一段式代码和三段式代码,是两种不同的状态机编码方式。在FPGA设计中,状态机通常用于管理系统的状态转换,根据输入信号和当前状态决定系统执行的下一步操作。状态机的编码方式有很多种,常见的有摩尔型...

    源代码、技术文档管理制度

    - **下载过程**: 在行政部经理、战略发展部经理、技术总监和索取者的共同监督下进行下载操作,并记录在《源代码、技术文档下载情况登记表》中。 #### 五、流程详解 - **上传流程**: 1. 开发人员整理项目源代码和...

    asp.net中一段显示下载进度条的下载文件代码

    本文将详细介绍如何在ASP.NET中实现一个能够显示下载进度条的文件下载功能,并通过提供的代码片段来逐步分析其实现细节。 #### 代码解析 首先,我们来看一下这段关键代码: ```csharp public static void ...

    Python3中的单线程带进度条和多线程下载文件代码及注意事项

    网上的一些代码可能会有些奇怪的问题,用的是类全局变量打开文件但在多线程中并未加锁,会导致文件有一定几率出现大小和源文件不同,即使文件大小相同,MD5值也不同,中间有一段是坏的,在图片和音频中可能只是其中一...

    软著申请:源代码文件模板,每页五十行,一共六十页

    本资源是一个基于Java语言的源代码文件模板,总共六十页,每页五十行,主要涉及到嵌入式校园网网络质量监测系统的开发。以下是相关知识点的总结: 1. Java语言基础:该源代码文件模板使用Java语言编写,涉及到Java...

    .net的代码段资源

    在给定的压缩包文件中,我们看到一个名为"BellwareNUnit.snippet"的文件,这暗示了它可能包含与NUnit测试框架相关的代码片段。 NUnit是一个流行的开源单元测试框架,广泛用于.NET应用程序的测试。代码段资源对于...

    UE4vs代码段.zip

    "UE4vs代码段.zip" 文件集合就是这样一个实用资源,它包含了一些预定义的代码片段,可以帮助开发者快速实现特定功能,提高开发效率。 首先,让我们详细了解一下这些代码段的具体内容: 1. **快捷创建碰撞事件的三...

    HaoZip1.7源代码及其说明文档

    在本文件中,我们将深入探讨HaoZip1.7源代码的关键知识点,并结合其说明文档,为你带来一次全面的解析之旅。 首先,我们来看`HaoZip1.7.src.7z`这个压缩文件,它包含了HaoZip1.7的全部源代码。源代码通常由各种编程...

    下载代码

    这段代码是Java实现的一个简单的HTTP文件下载功能,主要涉及到网络编程和文件操作。下面将详细解释其中的关键知识点: 1. **URL与HttpURLConnection**: - `URL`(Uniform Resource Locator)类是Java中用于表示...

    c语言写的 一 段代码

    描述中提到的"C语言写的一段程序"可能是一个简单的示例,也可能是一个具有特定功能的完整代码。作者希望这个代码对其他人有所帮助,并对社区的支持表示感谢。这种分享精神是开源和编程社区中常见的,通过共享代码,...

    222661一段开启摄像头的代码(BCB)

    压缩包内的文件"一段开启摄像头的代码(BCB).txt"很可能包含了实现上述功能的源代码,而"www.pudn.com.txt"可能是从PUDN网站上下载此代码的来源记录或者其他相关资料。PUDN是一个知名的编程资源分享网站,开发者经常...

    求简易的代码

    从给定的文件信息来看,标题“求简易的代码”表明了请求者正在寻找或需要一段简单的编程代码。描述部分“求简易的代码,谢谢各位老大!”进一步确认了这一需求,同时表达了请求者的礼貌和对帮助者的尊重。然而,描述中...

    uploadify多文件上传例子代码

    这段代码遍历request中的所有parts,对每个文件进行写入操作,将文件保存到服务器的指定目录下。 此外,为了提供更好的用户体验,你还可以在uploadify中添加各种事件监听器,比如onSelect、onProgress、onComplete...

    HTTP 下载 源代码

    在IT行业中,HTTP(超文本传输协议)是用于在Web上传输数据的主要协议,而C++是一种强大的编程语言,常用于构建系统级和高性能...通过学习和理解这段代码,开发者能够掌握在网络环境中使用C++进行高效文件下载的技能。

    简易词法分析器(源代码)

    这段代码定义了三个规则:识别数字序列(转化为整型)、识别标识符(由字母、下划线或数字组成)以及捕获所有其他字符。当匹配到规则时,对应的C代码块会被执行,如打印出发现的标记。 在实际开发中,词法分析器的...

Global site tag (gtag.js) - Google Analytics