<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    athrunwang

    紀元
    數據加載中……
    canghailan 使用URLConnection下載文件
    package canghailan;

    import canghailan.util.StopWatch;

    import java.io.*;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    /**
     * User: canghailan
     * Date: 11-12-9
     * Time: 下午2:03
     */
    public class Downloader implements Callable<File> {
        protected int connectTimeout = 30 * 1000; // 連接超時:30s
        protected int readTimeout = 1 * 1000 * 1000; // IO超時:1min

        protected int speedRefreshInterval = 500; // 即時速度刷新最小間隔:500ms

        protected byte[] buffer;

        private URL url;
        private File file;

        private float averageSpeed;
        private float currentSpeed;

        public Downloader() {
            buffer = new byte[8 * 1024]; // IO緩沖區:8KB
        }

        public void setUrlAndFile(URL url, File file) {
            this.url = url;
            this.file = autoRenameIfExist(file);
            this.averageSpeed = 0;
            this.currentSpeed = 0;
        }

        public URL getUrl() {
            return url;
        }

        public File getFile() {
            return file;
        }

        public float getAverageSpeed() {
            return averageSpeed;
        }

        public float getCurrentSpeed() {
            return currentSpeed;
        }

        @Override
        public File call() throws Exception {
            StopWatch watch = new StopWatch();
            watch.start();

            InputStream in = null;
            OutputStream out = null;
            try {
                URLConnection conn = url.openConnection();
                conn.setConnectTimeout(connectTimeout);
                conn.setReadTimeout(readTimeout);
                conn.connect();

                in = conn.getInputStream();
                out = new FileOutputStream(file);

                int time = 0;
                int bytesInTime = 0;
                for (; ; ) {
                    watch.split();
                    int bytes = in.read(buffer);
                    if (bytes == -1) {
                        break;
                    }
                    out.write(buffer, 0, bytes);

                    time += watch.getTimeFromSplit();
                    if (time >= speedRefreshInterval) {
                        currentSpeed = getSpeed(bytesInTime, time);
                        time = 0;
                        bytesInTime = 0;
                    }
                }
            } catch (IOException e) {
                file.delete();
                throw e;
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                    }
                }
                if (out != null) {
                    try {
                        out.flush();
                        out.close();
                    } catch (IOException e) {
                    }
                }
            }

            watch.stop();
            averageSpeed = getSpeed(file.length(), watch.getTime());

            return file;
        }

        private static float getSpeed(long bytesInTime, long time) {
            return (float) bytesInTime / 1024 / ((float) time / 1000);
        }

        private static String getExtension(String string) {
            int lastDotIndex = string.lastIndexOf('.');
            // . ..
            if (lastDotIndex > 0) {
                return string.substring(lastDotIndex + 1);
            } else {
                return "";
            }
        }

        private static File autoRenameIfExist(File file) {
            if (file.exists()) {
                String path = file.getAbsolutePath();

                String extension = getExtension(path);
                int baseLength = path.length();
                if (extension.length() > 0) {
                    baseLength = path.length() - extension.length() - 1;
                }

                StringBuilder buffer = new StringBuilder(path);
                for (int index = 1; index < Integer.MAX_VALUE; ++index) {
                    buffer.setLength(baseLength);
                    buffer.append('(').append(index).append(')');
                    if (extension.length() > 0) {
                        buffer.append('.').append(extension);
                    }
                    file = new File(buffer.toString());
                    if (!file.exists()) {
                        break;
                    }
                }

            }
            return file;
        }

        public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
            URL url = new URL("http://www.google.com.hk/");
            File file = new File("/home/canghailan/google.html");

            ExecutorService executorService = Executors.newSingleThreadExecutor();
            Downloader downloader = new Downloader();
            downloader.setUrlAndFile(url, file);
            File downloadFIle = executorService.submit(downloader).get();
            System.out.println("download " + downloadFIle.getName() +
                    " from " + url +
                    " @" + downloader.getAverageSpeed() + "KB/s");
        }
    }
    package canghailan.util;

    import java.util.concurrent.TimeUnit;

    /**
     * User: canghailan
     * Date: 11-12-9
     * Time: 下午3:45
     * <pre>
     * RUNNING:
     * startTime              split                        now
     * |<-   getSplitTime()   ->|<-   getTimeFromSplit()   ->|
     * |<-                   getTime()                     ->|
     * <pre/>
     * <pre>
     * STOPPED:
     * startTime                           stop            now
     * |<-           getTime()            ->|
     * <pre/>
     */
    public class StopWatch {
        private long startTime;
        private long stopTime;

        private State state;
        private boolean split;

        public StopWatch() {
            reset();
        }

        public void start() {
            if (state == State.UNSTARTED) {
                startTime = System.nanoTime();
                state = State.RUNNING;
                return;
            }
            throw new RuntimeException("Stopwatch already started or stopped.");
        }

        public void stop() {
            switch (state) {
                case RUNNING: {
                    stopTime = System.nanoTime();
                }
                case SUSPENDED: {
                    state = State.STOPPED;
                    split = false;
                    return;

                }
            }
            throw new RuntimeException("Stopwatch is not running.");
        }

        public void reset() {
            state = State.UNSTARTED;
            split = false;
        }

        public void split() {
            if (state == State.RUNNING) {
                stopTime = System.nanoTime();
                split = true;
                return;
            }
            throw new RuntimeException("Stopwatch is not running.");
        }

        public void suspend() {
            if (state == State.RUNNING) {
                stopTime = System.nanoTime();
                state = State.SUSPENDED;
                return;
            }
            throw new RuntimeException("Stopwatch must be running to suspend.");
        }

        public void resume() {
            if (state == State.SUSPENDED) {
                startTime += System.nanoTime() - stopTime;
                state = State.RUNNING;
                return;
            }
            throw new RuntimeException("Stopwatch must be suspended to resume.");
        }

        public long getTime() {
            return TimeUnit.NANOSECONDS.toMillis(getNanoTime());
        }

        public long getNanoTime() {
            switch (state) {
                case RUNNING: {
                    return System.nanoTime() - startTime;
                }
                case STOPPED:
                case SUSPENDED: {
                    return stopTime - startTime;
                }
                case UNSTARTED: {
                    return 0;
                }
            }
            throw new RuntimeException("Should never get here.");
        }

        public long getSplitTime() {
            return TimeUnit.NANOSECONDS.toMillis(getSplitNanoTime());
        }


        public long getSplitNanoTime() {
            if (split) {
                return stopTime - startTime;
            }
            throw new RuntimeException("Stopwatch must be running and split to get the split time.");
        }

        public long getTimeFromSplit() {
            return TimeUnit.NANOSECONDS.toMillis(getNanoTimeFromSplit());
        }

        public long getNanoTimeFromSplit() {
            if (state == State.RUNNING && split) {
                return System.nanoTime() - stopTime;
            }
            throw new RuntimeException("Stopwatch must be running and split to get the time from split.");
        }

        enum State {
            UNSTARTED,
            RUNNING,
            STOPPED,
            SUSPENDED
        }

    }

    posted on 2011-12-28 20:07 AthrunWang 閱讀(448) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久精品国产亚洲网站| 亚洲精品自产拍在线观看动漫| 亚洲精品午夜无码电影网| 亚洲综合男人的天堂色婷婷| 亚洲成在人线aⅴ免费毛片| 中文字幕无码免费久久9一区9| 国产桃色在线成免费视频| 亚洲Av无码乱码在线播放| 无码久久精品国产亚洲Av影片 | 国产成人亚洲精品影院| 亚洲精品视频观看| 日本高清不卡中文字幕免费| **实干一级毛片aa免费| 亚洲精品无码av天堂| 亚洲国产精品综合久久久| 人人鲁免费播放视频人人香蕉| 亚洲免费人成视频观看| 国产成人亚洲综合无码| 亚洲一级特黄特黄的大片| 男女一进一出抽搐免费视频| 无码少妇一区二区浪潮免费| 日韩亚洲欧洲在线com91tv| 亚洲AV无码一区二区三区牲色| 美丽姑娘免费观看在线观看中文版| 四虎永久免费地址在线网站| 亚洲欧洲日产韩国在线| 成人无码精品1区2区3区免费看| 在线观看免费污视频| 亚洲色图国产精品| caoporm超免费公开视频| 最新免费jlzzjlzz在线播放| 亚洲国产成人片在线观看无码| 美女被免费网站视频在线| 四虎国产精品免费久久| 亚洲精品私拍国产福利在线| 一边摸一边桶一边脱免费视频| 岛国av无码免费无禁网站| 中文字幕在线观看亚洲| 91福利免费网站在线观看| 又黄又爽的视频免费看| 亚洲成_人网站图片|