已知url实现文件下载源码

package cn.demo.com;

import java.io.*;
import java.net.*;
import java.util.*;

// This class downloads a file from a URL.
public class Download extends Observable implements Runnable
{

    // Max size of download buffer.
    private static final int MAX_BUFFER_SIZE = 1024;

    // These are the status names.
    public static final String STATUSES[] = {"Downloading", "Paused", "Complete", "Cancelled", "Error" };

    // These are the status codes.
    public static final int DOWNLOADING = 0;
    public static final int PAUSED = 1;
    public static final int COMPLETE = 2;
    public static final int CANCELLED = 3;
    public static final int ERROR = 4;

    public static int totalNum = 0;

    private static Object lock = new Object();

    private URL url; // download URL
    private int size; // size of download in bytes
    private int downloaded;
// number of bytes downloaded
    private int status; // current status of download

    private File file;

   /**
     * 
     * @param url
     * @param file
     */

    // Constructor for Download.
    public Download(URL url, File file)
    {
        this.url = url;
        size = -1;
        downloaded = 0;
        status = DOWNLOADING;

        this.file = file;

        // Begin the download.
    }

    // Get this download's URL.
    public String getUrl()
    {
        return url.toString();
    }

    // Get this download's size.
    public int getSize()
    {
        return size;
    }

    // Get this download's progress.
    public float getProgress()
    {
        return ((float) downloaded / size) * 100;
    }

    // Get this download's status.
    public int getStatus()
    {
        return status;
    }

    // Pause this download.
    public void pause()
    {
        status = PAUSED;
        stateChanged();
    }

    // Resume this download.
    public void resume()
    {
        status = DOWNLOADING;
        stateChanged();
        download();
    }

    // Cancel this download.
    public void cancel()
    {
        status = CANCELLED;
        stateChanged();
    }

    // Mark this download as having an error.
    private void error()
    {
        status = ERROR;
        stateChanged();
    }

    // Start or resume downloading.
    public void download()
    {
        synchronized (lock)
        {
            while (totalNum > 30)
            {
                try
                {
                    lock.wait();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }

            totalNum++;
        }

        Thread thread = new Thread(this);
        thread.start();
    }

    public static void finish()
    {
        try
        {
            Thread.sleep(1000);

            synchronized (lock)
            {
                while (totalNum > 0)
                {
                    lock.wait();
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Get file name portion of URL.
    private String getFileName(URL url)
    {
        String fileName = url.getFile();
        return fileName.substring(fileName.lastIndexOf('/') + 1);
    }

    // Download file.
    public void run()
    {
        RandomAccessFile randomFile = null;
        InputStream stream = null;

        try
        {
         
  // Open connection to URL.
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // Specify what portion of file to download.
            connection.setRequestProperty("Range", "bytes=" + downloaded + "-");

            // Connect to server.
            // connection.connect();

            // Make sure response code is in the 200 range.
            if (connection.getResponseCode() / 100 != 2)
            {
                error();
            }

            // Check for valid content length.
            int contentLength = connection.getContentLength();
            if (contentLength < 1)
            {
                error();
            }

            // Set the size for this download if it hasn't been already set.
            if (size == -1)
            {
                size = contentLength;
                stateChanged();
            }

            if (file == null)
            {
                file = new File(getFileName(url));
            }

            // Open file and seek to the end of it.

            System.out.println(file.getCanonicalPath());

            randomFile = new RandomAccessFile(file, "rw");
            randomFile.seek(downloaded);

            stream = connection.getInputStream();
            while (status == DOWNLOADING)
            {
               
// Size buffer according to how much of the file is left to download.
                byte buffer[];
                if (size - downloaded > MAX_BUFFER_SIZE)
                {
                    buffer = new byte[MAX_BUFFER_SIZE];
                }
                else
                {
                    buffer = new byte[size - downloaded];
                }

                // Read from server into buffer.
                int read = stream.read(buffer);
                if (read == -1)
                    break;

                // Write buffer to file.
                randomFile.write(buffer, 0, read);
                downloaded += read;
                stateChanged();
            }

            // Change status to complete if this point was reached because downloading has finished.
            if (status == DOWNLOADING)
            {
                status = COMPLETE;
                stateChanged();
            }
        }
        catch (Exception e)
        {
            error();
        }
        finally
        {
         
  // Close file.
            if (file != null)
            {
                try
                {
                    randomFile.close();
                }
                catch (Exception e)
                {
                }
            }

            // Close connection to server.
            if (stream != null)
            {
                try
                {
                    stream.close();
                }
                catch (Exception e)
                {
                }
            }
        }

        synchronized (lock)
        {
            totalNum--;
            lock.notifyAll();
        }
    }

    // Notify observers that this download's status has changed.
    private void stateChanged()
    {
        setChanged();
        notifyObservers();
    }

    public static void main(String args[]) throws Exception
    {

//        try
//        {
//            Download d =
//                new Download(new URL("http://kb.dsqq.cn/page/1/2014-06/11/F1/20140611F1_pdf.pdf"),
//                    new File("20140611F1_pdf.pdf"));
//        }
//        catch (MalformedURLException e)
//        {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }

        File parent = new File("d:/tmpPic");
        parent.mkdirs();

        for (int i = 200; i < 210; i++)
        {
            Download d = new Download(new URL("http://2.su.bdimg.com/skin/" + i + ".jpg"), new File(parent, i + ".jpg"));
            d.download();
            System.out.println(i);
        }
    }
}

 

转载于:https://my.oschina.net/u/3636643/blog/1503337

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值