-4

something.domain/myfile.txt のような URL があるとします。このファイルを「ファイルの保存」ダイアログで保存します。

最善を尽くしましたが、ダイアログを使用してファイルを保存するたびにファイルがありません。

例またはこれに関する情報を見つけることができる場所は、非常に役立ちます!

        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.
4

2 に答える 2

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) ...
}
于 2012-11-27T12:02:11.610 に答える
0

コードで、保存先を選択するオプションをユーザーに提供する前に、ファイルを保存/ダウンロードしようとしていることに気付きましたか?

コードを 3 つの異なる操作に分割します。

  1. InputStream(Web) からOutputStream(ファイル)にバイトを転送するメソッド。
  2. ファイルを保存する場所を選択できるように、ユーザーにダイアログを表示する方法。
  3. タスク全体を完了する方法: ファイルを選択し、Web からそれにバイトを転送します。

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)デューケリングがすでに述べたことと非常によく似たものになるでしょう:

public File chooseFile() {
  File result = null;
  JFileChooser fileChooser = new JFileChooser();
  if (fileChooser.showSaveDialog(fileChooser) == JFileChooser.APPROVE_OPTION) {
    result = fileChooser.getSelectedFile();
  }
  return result;
}

3) 次に、これら 2 つの操作を組み合わせるのは非常に簡単です。

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) はプライベート メソッドである可能性があります。もちろん、これは 1 つの操作にすぎませんが、分割すると、実行するさまざまな手順の概要がわかります。

注2:例外処理部分を簡略化しました

于 2012-11-27T12:22:50.360 に答える