您现在的位置是:首页 >

怎样制作iso系统镜像文件 用Java制作网络文件下载系统

火烧 2021-12-01 19:22:59 1039
用Java制作网络文件下载系统   由于Li ux操作系统的兴起和Java语言的日渐成熟 使用Java语言实现一个跨平台的 外观一致的下载工具软件已成为可能 网络蚂蚁是大家非常熟知的下载工具软件 我采

用Java制作网络文件下载系统  

怎样制作iso系统镜像文件 用Java制作网络文件下载系统
  由于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      lishixinzhi/Article/program/Java/hx/201311/26485  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码