hyljava

          java多線程下載

          import java.io.BufferedInputStream;
          import java.io.IOException;
          import java.io.RandomAccessFile;
          import java.net.HttpURLConnection;
          import java.net.URL;
          import java.net.URLConnection;
          import java.util.concurrent.CountDownLatch;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;


          public class FileDownLoadTest {
           
           
           private static final int TCOUNT = 10;
           
           private CountDownLatch latch = new CountDownLatch(TCOUNT);

           private long completeLength = 0;
           
           private long fileLength;
           /**
            * @param args
            * @throws Exception
            */
           public static void main(String[] args) throws Exception {
            
            new FileDownLoadTest().download("http://localhost:8080/test/IESSAction.docx");
           }
           
           
           public void download(String address) throws Exception{
            ExecutorService service = Executors.newFixedThreadPool(TCOUNT);
            URL url = new URL(address);
            URLConnection cn = url.openConnection();
            cn.setRequestProperty("Referer", "http://www.test.com");
            fileLength = cn.getContentLength();
            long packageLength = fileLength/TCOUNT;
            long leftLength = fileLength%TCOUNT;
            RandomAccessFile file = new RandomAccessFile("d:\\test.docx","rw");
            //計算每個線程請求文件的開始和結束位置
            long pos = 0;
            long endPos = pos + packageLength;
            for(int i=0; i<TCOUNT; i++){
             if(leftLength >0){
              endPos ++;
              leftLength--;
             }
             service.execute(new DownLoadThread(url, file, pos, endPos));
             pos = endPos;
             endPos = pos + packageLength;
            }
            System.out.println("waiting........................................");
            long begin = System.currentTimeMillis();
            latch.await();
            file.close();
            System.out.println("end........................................");
            System.out.println(System.currentTimeMillis() - begin + "ms");
            service.shutdown();
           }
           
           class DownLoadThread implements Runnable{
            
            private URL url;
            private RandomAccessFile file;
            private long from;
            private long end;
            
            DownLoadThread(URL url, RandomAccessFile file, long from, long end){
             this.url = url;
             this.file = file;
             this.from = from;
             this.end = end;
            }
            
            
            public void run() {
             long pos = from;
             byte[] buf = new byte[512];
             try {
              HttpURLConnection cn = (HttpURLConnection) url.openConnection();
              cn.setRequestProperty("Range", "bytes=" + from + "-" + end);
              if(cn.getResponseCode() != 200 && cn.getResponseCode()!=206){
               run();
               return;
              }
              BufferedInputStream bis = new BufferedInputStream(cn.getInputStream());
              int len ;
              while((len = bis.read(buf)) != -1){
          //     synchronized(file){
                file.seek(pos);
                file.write(buf, 0, len);
          //     }
               pos += len;
               completeLength +=len;
               System.out.println("threadName: " + Thread.currentThread().getName()
                 + "persent: " + completeLength * 100 /fileLength + "%");
              }
              cn.disconnect();
              latch.countDown();
             } catch (IOException e) {
              e.printStackTrace();
              
             }
            }
           }
          }

          posted on 2012-11-30 11:57 何云隆 閱讀(260) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 湘阴县| 通辽市| 嘉定区| 辽阳市| 尼勒克县| 罗甸县| 石泉县| 武鸣县| 本溪| 石台县| 涪陵区| 甘谷县| 隆化县| 舒城县| 准格尔旗| 新干县| 高邑县| 涞源县| 吐鲁番市| 商南县| 龙南县| 方正县| 白河县| 临颍县| 阿坝| 永顺县| 房产| 邵阳市| 翁牛特旗| 庄河市| 海丰县| 文水县| 明溪县| 筠连县| 托里县| 保德县| 平顺县| 大城县| 印江| 乡城县| 金川县|