2011-01-15 5 views
2
public void download(String url, String destination) { 
     BufferedOutputStream localBufferedOutputStream = null; 
     URLConnection localURLConnection = null; 
     InputStream localInputStream = null; 
     try { 
      URL localURL = new URL(url); 

      localBufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destination)); 
      localURLConnection = localURL.openConnection(); 
      localInputStream = localURLConnection.getInputStream(); 

      byte[] arrayOfByte = new byte[1024]; 
      int i; 
      while ((i = localInputStream.read(arrayOfByte)) != -1) { 
       localBufferedOutputStream.write(arrayOfByte, 0, i); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } finally { 
      try { 
       if (localInputStream != null) { 
        localInputStream.close(); 
       } 
       if (localBufferedOutputStream != null) { 
        localBufferedOutputStream.close(); 
       } 
      } catch (IOException localIOException3) { 
       System.out.println(localIOException3); 
      } 
     } 
    } 

私は自分のアプリケーションをデバッグすることだし、それは少し遅いようです。私はそれが私のインターネットかどうか疑問に思います。これはjavaでファイルをダウンロードする適切な方法ですか?ファイルは26MBです。これはjavaでファイルをダウンロードする最善の方法ですか?

+0

ウェブブラウザから同じファイルをダウンロードするとどうなりますか? – skaffman

+0

Javaに似ています:そのような正確で冗長な言語 – TheLQ

答えて

3

あなたはいつもApacheなどのライブラリに目を向ける必要があります。彼らはあなたのためのすべてのハードワークを行っている: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

を私は

static String readFileToString(File file) 
      Reads the contents of a file into a String using the default encoding for the VM. 

かなり多くを使用しています。別の方法として http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html

+0

copyURLToFileはストリームより優れていますか?それともストリームそのものですか? – Kyle

+0

デフォルトのエンコーディングを使用するのはひどい考えです。特にこの場合です。これは、プログラムが実行されているプラ​​ットフォームによって、データがさまざまな方法で破損することを意味します。 –

0

これは確かに最良の方法ではありません。すべての例外をスローするコードは、まれに何かを実行する最善の方法ではありません。パラメータとしてusi g文字列を使用しないことも考えられます。 URIとFileは良い選択肢になります。

コピーしたい場合はtransferToは良い方法であるストリーム。

1

すでにバッファを自分で使用しているので、あなたはBufferedOutputStreamを残すことができます。しかし、それは大きな違いをもたらすことはありません。 (またはしない場合があります)大きな違いを生むことが何

ではなく、ストリームのusing the nio channel classesです。

+0

そして、もっと大きなバッファを使うことができます。 8192. – EJP

1

とちょうど参考のために、あなたはHTMLUnitを調査することができます。

あなたはURLを知っている場合(およびそのストリームが)を見てください。このフレームワークでは、ブラウザのリダイレクトがあるサイトでもファイルをダウンロードできます。

http://htmlunit.sourceforge.net/

+1

私はこれに尋ねて以来、とても長い時間が経ちました。 xDジェームズの答えをありがとう。私は、apacheの道を行くことを覚えています。私は最近htmlunitをチェックして覚えていると、それは素晴らしいだったページでjavascriptを実行したことがわかりました。おかげで – Kyle

+1

あなたはいくつかの進歩を聞いて偉大な。 Btw、あなたはファイルの完全性テストやダウンロード割り込みの処理のようなものに行きましたか?また、これは興味深いかもしれません:http://stackoverflow.com/questions/4687615/how-to-achieve-transfer-file-between-client-and-server-using-java-socket/4687706#4687706 –

+0

私は持っていますない。私は停止/ダウンロードを再開しようとしたことを覚えていると私はjdownloaderのソースコードを見て示唆されたが、私はしなかった。そのリソースをありがとう。 – Kyle

関連する問題