黑马程序员技术交流社区

标题: range头加RandomAccessFile对象实现多线程文件下载 [打印本页]

作者: as604049322    时间: 2015-6-9 12:53
标题: range头加RandomAccessFile对象实现多线程文件下载

  1. package day04_tomcat;

  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.RandomAccessFile;
  5. import java.net.URL;
  6. import java.net.URLConnection;

  7. public class Test {

  8.         public static void main(String[] args) throws IOException {
  9.                 URL url=new URL("http://127.0.0.1:8080/day05_header/xiao.jpg");
  10.                 speedThreadDownload(url, 3,"F:/3.jpg");
  11.                 //download(url);
  12.         }
  13.        
  14.         /**
  15.          *
  16.      * @param url 被请求下载的URL
  17.          * @param threadNum 用于下载的线程数
  18.          * @param path 文件保存位置
  19.          * @throws IOException
  20.          */
  21.         private static void speedThreadDownload(URL url,int threadNum,final String path) throws IOException
  22.                          {
  23.                 int length=url.openConnection().getContentLength();
  24.                 System.out.println("文件总字节数:"+length);
  25.                
  26.                 final int baseNum=length/threadNum;
  27.                 for(int i=1;i<=threadNum;i++){
  28.                         final URLConnection con=url.openConnection();
  29.                         String by="bytes="+baseNum*(i-1)+"-"+(i==threadNum?length:(baseNum*i-1));
  30.                         //System.out.println(by);
  31.                         con.setRequestProperty("range", by);
  32.                         final int index=baseNum*(i-1);
  33.                         new Thread(new Runnable() {
  34.                                 @Override
  35.                                 public void run() {
  36.                                         int len=0;
  37.                                         byte[] bytes=new byte[1024];
  38.                                         try (RandomAccessFile daf
  39.                                                         = new RandomAccessFile(path, "rw");
  40.                                                 InputStream in=con.getInputStream();){
  41.                                                 daf.seek(index);
  42.                                                 while((len=in.read(bytes))>0)
  43.                                                         daf.write(bytes,0,len);
  44.                                                
  45.                                         } catch (IOException e) {
  46.                                                
  47.                                                 e.printStackTrace();
  48.                                         }
  49.                                 }
  50.                         }).start();
  51.                 }
  52.         }
  53.        
  54. }


复制代码


作者: as604049322    时间: 2015-6-9 12:55
就这么一点代码我写了一上午,,改了无数遍,,实际写的东西是它的十倍以上




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2