知识大全 用Java制作网络文件下载系统

Posted 文件

篇首语:勤奋的人是时间的主人,懒惰的人是时间的奴隶。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Java制作网络文件下载系统相关的知识,希望对你有一定的参考价值。

用Java制作网络文件下载系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  由于Linux操作系统的兴起和Java语言的日渐成熟 使用Java语言实现一个跨平台的 外观一致的下载工具软件已成为可能 网络蚂蚁是大家非常熟知的下载工具软件 我采用Java语言实现了类似网络蚂蚁的基本功能的软件Jants 本文介绍了一些技术实现要点     单线程直接获取网络文件    单线程直接获取网络文件的关键点是获取网络文件 以确定基本方法的正确性 它的初始代码的内容比较简单 可以利用HTTP的基本知识进行设计 它的基本原理是 连接网络地址 打开连接并获取输入流 从输入流中读取数据 实现代码(测试过程中使用的)如下     int data;//从输入流中获取数据  URL url=new URL( );  //创建连接的地址  HttpURLConnection connection=url openConnection();  //打开连接  int responsCode=connection getResponseCode();  //返回Http的响应状态码  InputStream input=connection getInputStream();  //获取输入流  System out println( responseCode: +responseCode);  While((data=input read())!= )  System out println(data);  //将获取的数据打到屏幕显示出来           单线程断点续传      大家常常有这样的体会:下载一个几十兆的文件时突然断线 结果前功尽弃 可以使用断点续传解决这个问题     基本原理     这里主要介绍一下断点续传的原理 断点续传的原理很简单 只是在HTTP请求上和一般的下载有所不同     所谓断点续传 也就是要从文件已经下载的地方开始继续下载 所以 在客户端传给Web服务器的时候 要多加一条信息——下载的起始位置 且服务器返回的HTTP状态代码也从 转变为     上述要点 可以使用Java语言中的HttpURLConnection类中的setRequestProperty()方法来设置     断点续传的关键步骤      实现提交断点续传下载的起始位置     Java的Net包中提供了这种功能 代码如下     URL url = new URL( ;);   HttpURLConnection Connection=(HttpURLConnection) url openConnection();   //设置断点续传的开始位置   ( RANGE bytes= );   //设置请求信息  ( GET /down zip HTTP/ );  //设置接受信息  ( Accept image/gif image/x xbitmap application/  msword */* );  //设置连接信息  ( Connection Keep Alive );   //获得输入流   InputStream input = ();    从输入流中取出的字节流 就是down zip文件从 字节开始的字节流      保存获得的字节流到文件中     由于文件的下载涉及到断点续传 因此 在保存文件的时候 需要对文件进行随机读写 特别是在多线程下载的过程中 需要在写文件之前在文件中定位     在Java的IO包中的RandomAccessFile类可以满足这种设计需求 该类在文件中定位指针时 用到的方法是seek(Long)     操作相当简单 假设从 字节处开始保存文件 代码如下     RandomAccess oSavedFile = new RandomAccessFile( down zip rw );   //创建随机文件  long nPos = ;   //定位文件指针到nPos位置   oSavedFile seek(nPos);   byte[] b = new byte[ ];   int nRead;   //从输入流中读入字节流 然后写到文件中   while((nRead=input read(b )) > )    //input为网络输入流   oSavedFile write(b nRead);         保存已经下载的文件的长度值     由于在每次断开连接时都要保存已下载文件的长度 且应进行永久保存 因此将它保存到文件介质中 这里采用的是对象序列化的方法——将要保存的内容序列化到一个临时文件中 代码如下     long nStart;  //记录已经下载的字节数  File tempFile=new File( donwzip tmp );  //创建临时文件  FileOutputStream file=new FileOutputStream(tempFile);   //创建文件输出流   ObjectOutputStream serialize=new ObjectOutputStream(file)   //创建文件序列化流  serialize writeObject(nStart);//序列化  serialize flush();  //刷新序列化流  file close();  //关闭文件输出流  serialize close();  //关闭序列化流           多线程的断点续传      加入断点续传以后 下载速度还没能得到提高 为防止已下载文件数据的丢失 也为提高网络文件的下载速度 可在其中加入多线程 虽然前两步已经基本实现 似乎再加入多线程时应该比较容易 但是并非如此 在多线程的编程过程中 需要考虑到线程的同步与互斥 由于是多线程进行断点续传 还要考虑记录多个断点位置 且记录断点位置时也要考虑同步互斥等问题 所有这些都使得这一步比较复杂     同步的考虑     同步的基本思想是避免多个线程访问同一个资源时出现问题 由于多线程对同一个文件资源进行读写 因此 为了避免出现错误 要进行读写控制——即同步 Java中使用synchronized实现线程之间的同步 Java是面向对象的语言 它的资源是以对象的形式表现的 因此 Java同步机制的作用就是力图避免对 对象 的访问冲突     对需要同步的方法或代码段进行标记以实现同步 需要用到关键字synchronized 系统使用synchronized关键字声明的方法就是为其设置特殊的标记 这个标记起著信号量的作用 每当调用该方法时 Java的运行系统都将进行检查 以确认此标记的状态 看相应的代码是否已经被调用执行 如没有执行 系统将把这个内部标记授予调用代码的线程 方法运行结束后 标记被释放 在标记被释放之前 任何其它的对象不得调用此方法     主要的同步代码如下(在下载数据保存入文件中时使用)     public synchronized int write(byte[] b int nStart int len)   int n= ;   try   rf write(b nStart len);   //调用另一个类的方法 向文件中写入数据   n=len;   catch(IOException ioe)   ioe printStackTrace();      return n;        在保存已下载的字节数时 由于多个断点位置在不同的线程中记录 所以必须在所有线程都结束时才能保存 为此 解决的办法是再开出一个线程 用以持续监测是否所有的线程都已经结束 若结束 保存所有的断点位置 否则 继续监测 同样 在文件下载的线程中 需要设置标志位以记录线程是否结束 基本代码如下(在监测线程中使用)     stop=false;  while(!stop)     if(Utility bStop[ ] && Utility bStop[ ] && Utility bStop[ ] && Utility bStop[ ] && Utility bStop[ ])      System out println( Serialize );      Utility serializeOut();      //调用序列化函数以保存断点位置于文件中      javaants setStopFalse();      javaants setStartTrue();      stop=true;               断点数据的记录     笔者使用的是一个静态数组以记录断点位置 由于有多个断点位置 可采用一个函数进行统一保存     public static void serializeOut()    try     File tempFile=new File(getTempFileName()+ + tmp );       FileOutputStream file=new FileOutputStream(tempFile);      ObjectOutputStream serialize=new ObjectOutputStream(file);     for(int i= ;i< ;i++)      serialize writeObject(String valueOf(nStart[i]));      serialize writeObject(String valueOf(nStop[i]));          serialize flush();     file close();     serialize close();   catch(Exception e)       System out println(e toString());           图形界面    该文件下载系统的图形界面与流行下载软件——网络蚂蚁很相似 图形界面的实现 使用了Swing包 限于篇幅 这里不再赘述 Jants的图形界面如图 和图 所示      图 Jants主界面    图 Jants下载过程中的界面    发布    使用jar命令将所有的文件下载系统的 class文件打包为javaants jar文件 并在其中加入Menifest mf文件 指定Main Class     打包代码 jar cfv * * javaants jar  运行代码 javaw classpath javaants jar Main      cha138/Article/program/Java/hx/201311/26485

相关参考

知识大全 用大白菜制作了U盘启动系统,怎么把镜像文件放进去

用大白菜制作了U盘启动系统,怎么把镜像文件放进去  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!用大白

知识大全 Java实现基于http协议的网络文件下载

Java实现基于http协议的网络文件下载  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  HTT

知识大全 Java获取网络文件并插入数据库

Java获取网络文件并插入数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  抓取各大网站的数

知识大全 为何我用同一个win7的镜像文件用大白菜制作了两个U盘系统,其中有一个U盘安装出来后没有办公软件

为何我用同一个win7的镜像文件用大白菜制作了两个U盘系统,其中有一个U盘安装出来后没有办公软件  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整

知识大全 怎样制作可执行的java程序

  常常在网上看到有人询问如何把java程序编译成exe文件通常回答只有两种一种是制作一个可执行的JAR文件包然后就可以像chm文档一样双击运行了而另一种是使用JET来进行  编译但是JET是要用钱买

知识大全 电脑无法开机怎么用u盘重装xp系统

电脑无法开机怎么用u盘重装xp系统到可以正常上网的电脑去制作个u启动盘和下载一个系统镜像文件就可以安装了1.用【u深度u盘启动盘制作工具】做一个启动U盘;2.下载一个xp系统镜像;3.BIOS中设置从

知识大全 联想笔记本电脑怎样用u盘重装xp系统

联想笔记本电脑重装系统怎样用u盘安装系统你好1、下载U启动U盘制作软件,安装软件,启动,按提示制作好启动盘。2、下载一个你要安装的系统,复制到制作好的U盘里,启动盘就做好了。3、插入U盘开机,按DEL

知识大全 win0怎么用大白菜做win7系统

win0怎么用大白菜做win7系统1.准备一个不小于4G的空白U盘,下载Win7系统盘的镜像文件(建议为gho格式)。2.下载安装大白菜u盘启动盘制作工具。3.接上U盘,打开大白菜工具,点击“一键制作

知识大全 怎样用u盘启动系统装windows7 64位

怎样用u盘启动系统装windows764位步骤如下:先下载好win764位系统iso文件备用;下载这个UltraISO软件把下载好的iso系统文件写进U盘(一般不建议);或者下载大白菜U盘系统盘制作软

知识大全 java网络通信小程序

  //ChatServerjava文件  importjavaio*;  import*;  importjavautil*;  publicclassChatServer  booleanstar