如何保存下载的文件从服务器在java

问题描述:

我有一个java类从服务器下载文件,此文件开始下载,也完成了下载,但它没有给出它保存在本地系统的路径,或我认为它不保存该文件,请指导我如何将它保存在窗口的下载文件夹中或任何其他文件夹中。如何保存下载的文件从服务器在java

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



    class Download extends Observable implements Runnable { 


    private static final int MAX_BUFFER_SIZE = 1024; 

    public static final String STATUSES[] = {"Downloading", 
     "Paused", "Complete", "Cancelled", "Error"}; 

    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; 

    private final 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 

    public Download(URL url) { 
     this.url = url; 
     size = -1; 
     downloaded = 0; 
     status = DOWNLOADING; 

     // Begin the download. 
     download(); 
    } 

    public String getUrl() { 
     return url.toString(); 
    } 

    public int getSize() { 
     return size; 
    } 

    public float getProgress() { 
     return ((float) downloaded/size) * 100; 
    } 

    public int getStatus() { 
     return status; 
    } 

    public void pause() { 
     status = PAUSED; 
     stateChanged(); 
    } 

    public void resume() { 
     status = DOWNLOADING; 
     stateChanged(); 
     download(); 
    } 

    public void cancel() { 
     status = CANCELLED; 
     stateChanged(); 
    } 

    private void error() { 
     status = ERROR; 
     stateChanged(); 
    } 

    private void download() { 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

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

    public void run() { 
     RandomAccessFile file = 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(); 
      } 

      // Open file and seek to the end of it. 
      file = new RandomAccessFile(getFileName(url), "rw"); 
      file.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. 
       file.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(); 
       System.err.println("cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"); 
      } 
     } catch (Exception e) { 
      error(); 
     } finally { 
      // Close file. 
      if (file != null) { 
       try { 
        file.close(); 
       } catch (Exception e) { 
       } 
      } 

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

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

当您创建RandomAccessFile的(),第一个参数是文件的名称和位置。尝试打印absolutePath()并查看此文件驻留的位置。

+0

你能告诉我,我必须把这个代码? – gurjeet

+0

尝试创建新的RandomAccessFile(“c:\\ temp \\ myfile.txt”,“RW”),然后根据您的原始代码将下载的内容写入此文件。我可以看到你试图匹配URL的文件名。所以如果是这样的话,文件应该保存在你启动应用程序的位置。再次,调用file.getAbsolutePath()应该显示文件位置。 –