使用Java下载并保存文件

时间:2012-11-23 18:10:37

标签: java

假设我有一个URL,比如something.domain / myfile.txt,然后我想用“保存文件”对话框保存这个文件。

我尽力做到了,但每次使用对话框保存文件时,文件都不存在。

我可以找到有关此信息的示例或某处可以提供很多帮助!

        URL website = null;
                try {
                    website = new URL(<insert url here>);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                ReadableByteChannel rbc = null;
                try {
                    rbc = Channels.newChannel(website.openStream());
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream(new File("minecraft.jar"));
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                }
                try {
                    fos.getChannel().transferFrom(rbc, 0, 1 << 24);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                    JFileChooser fileChooser = new JFileChooser();
                    if (fileChooser.showSaveDialog(fileChooser) == JFileChooser.APPROVE_OPTION) {
                      File dir = fileChooser.getCurrentDirectory(); 
                      dir.mkdir();
                      //After this point is where I need help.

2 个答案:

答案 0 :(得分:0)

我相信这就是你要找的东西:

if (fileChooser.showSaveDialog(fileChooser) == JFileChooser.APPROVE_OPTION)
{
  File file = fileChooser.getSelectedFile();
  // whatever you want to do with the file
  System.out.println("The file is "+file.getAbsolutePath());
  // fos = new FileOutputStream(file) ...
}

答案 1 :(得分:0)

您是否注意到在您的代码中,您尝试保存/下载文件,然后向用户提供选择目的地的选项?

我会将代码分成三个不同的操作:

  1. 负责将字节从InputStream(网络)传输到OutputStream(文件)的方法。
  2. 一种向用户显示对话框的方法,以便他可以选择存储文件的位置。
  3. 完成整个任务的方法:选择一个文件并将字节从Web传输到它。
  4. 1)会是这样的(你不需要使用NIO API来实现它):

    public void transfer(InputStream in, OutputStream out) throws IOException {
       byte[] buffer = new byte[2048];
       int bytesRead;
       while ((bytesRead = in.read(buffer)) > 0) {
          out.write(buffer, 0, bytesRead);
       }
    }
    

    2)与Dukeling已经说过的内容非常类似:

    public File chooseFile() {
      File result = null;
      JFileChooser fileChooser = new JFileChooser();
      if (fileChooser.showSaveDialog(fileChooser) == JFileChooser.APPROVE_OPTION) {
        result = fileChooser.getSelectedFile();
      }
      return result;
    }
    
    然后,将这两个操作结合在一起非常简单:

    public void saveFileFromWeb(URL url) {
      File file = chooseFile();   // 1. Choose the destination file
      if (file != null) {
        // 2. Create parent folder structure
        File folder = file.getParentFile();
        if (!folder.exist()) {
           folder.mkdirs();
        }
    
        InputStream in = null;
        OutputStream out = null;
        try {
          // 3. Initialise streams
          in = url.openStream();
          out = new FileOuputStream(file);
          // 4. Transfer data
          transfer(in, out);
        } catch (IOException e) {
           e.printStackTrace();
        } finally {
          // 5. close streams
          if (in != null) {
            try {
              in.close();
            } catch (IOException e) { /* ignore */ }
          }
          if (out != null) {
            try {
              out.close();
            } catch (IOException e) { /* ignore */ }
        }
      }
    }
    

    注意:1)和2)可能是私有方法。当然,你可以这样做只是一个操作,但拆分它会让你概述要执行的不同步骤。

    注意2 :我简化了异常处理部分