package { status = DOWNLOADING; stateChanged(); //

package download;import java.io.*;import java.net.*;import java.util.*; // This class downloads a file from a URL.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”};         // To check the status    public static final int DOWNLOADING = 0;            //downloading    public static final int PAUSED = 1;             //paused    public static final int COMPLETE = 2;                   //completed    public static final int CANCELLED = 3;          //cancled    public static final int ERROR = 4;              //Error          private URL url; //  URL    private int size; // size in bytes    private int downloaded; // number of downloaded bytes     private int status; // current status of download         // Constructor for Download.    public Download(URL url) {        this.url = url;        size = -1;                  // download from url        downloaded = 0;        status = DOWNLOADING;                 // Begin the download.        download();                 //download function need to code    }         // Get this download’s URL.    public String getUrl() {        return url.toString();              // get the URL    }         // Get this download’s size.    public int getSize() {        return size;                    //get Size of the file    }         // Get this download’s progress.    public float getProgress() {        return ((float) downloaded / size) * 100;       //progress    }         // Get this download’s status.    public int getStatus() {        return status;                      //get status    }         // Pause this download.    public void pause() {        status = PAUSED;        stateChanged();                     // cahnge the state    }         // Resume this download.    public void resume() {        status = DOWNLOADING;        stateChanged();                         // resume download        download();    }         // Cancel this download.    public void cancel() {        status = CANCELLED;                 //cancel        stateChanged();    }         // Mark this download as having an error.    private void error() {        status = ERROR;        stateChanged();                 //if something goes wrong    }         // Start or resume downloading.    private void download() {        Thread thread = new Thread(this);        thread.start();                         //new thread to start downloading    }         // Get file name portion of URL.    private String getFileName(URL url) {        String fileName = url.getFile();                        // File Name        return fileName.substring(fileName.lastIndexOf(‘/’) + 1);    }         // Download file.    public void run() {        RandomAccessFile file = null;        InputStream stream = null;                 try {            // Open connection            HttpURLConnection connection =                    (HttpURLConnection) url.openConnection();                         // portion of file to be download.            connection.setRequestProperty(“Range”,                    “bytes=” + downloaded + “-“);                         // Connect.            connection.connect();                         // Make sure response code is in the 200 range.            if (connection.getResponseCode() / 100 != 2) {                error();    // if not give an error            }                         // Check for valid content length.            int contentLength = connection.getContentLength();            if (contentLength < 1) {                error();                //content length            }                   // Set the size            if (size == -1) {                size = contentLength;                stateChanged(); //change state            }                         file = new RandomAccessFile(getFileName(url), "rw");                    file.seek(downloaded);         //seeking                         stream = connection.getInputStream();            while (status == DOWNLOADING) {        // how much left to be downloaded                byte buffer;                if (size - downloaded > MAX_BUFFER_SIZE) {                    buffer = new byteMAX_BUFFER_SIZE;         // according to buffer                } else {                    buffer = new bytesize – downloaded;                }                                                 int read = stream.read(buffer);                if (read == -1)                    break;                      // Read from server into buffer.                                 file.write(buffer, 0, read);                downloaded += read;                                     // Write buffer to file.                stateChanged();            }                         if (status == DOWNLOADING) {                status = COMPLETE;                stateChanged();                       // if file is downloaded            }        } catch (IOException e) {            error();        } finally {                        if (file != null) {                try {                    file.close();               // Close file.                } catch (IOException e) {}            }                                     if (stream != null) {                try {                    stream.close();                             // Close connection to server.                } catch (IOException e) {}            }        }    }         // Notify observers that this download’s status has changed.    private void stateChanged() {        setChanged();               // change the state        notifyObservers();    }}