2012-03-29 5 views
1

JavaコードでWGETを使用してファイルをダウンロードしていますが、20 MBのファイルをダウンロードするのに約10分かかります。しかし、wgetをコマンドラインからダウンロードすると、同じファイルが10MbPsの速度で7秒でダウンロードされます。誰がなぜこれが分かっていますか? Javaコードを改善するにはどうすればよいですか?WGETのダウンロードはコマンドラインから実行すると高速になりますが、Javaコードで実行すると遅くなります

以下は、WGETを使用してファイルをダウンロードするために使用したコードです。 20 MBのファイルをダウンロードするのに約10分かかります。しかし、コマンドラインでwgetコマンドを実行すると、数秒で発生します!!

import java.io.BufferedReader; 
    import java.io.File; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.net.URLConnection; 



public class WGETServer 
{ 



public File download(URL sourceurl, String username, String password, String fileName) 
{ 
    //System.out.println("WGET download() is starting ..."); 

    File file = null; 
    URLConnection urlConnection = null; 
    BufferedReader reader = null; 
    FileOutputStream outputStream = null; 
    try { 

     urlConnection = sourceurl.openConnection(); 

      String userNameAndPassword = username +":"+ password; 
      String encoding = new sun.misc.BASE64Encoder().encode (userNameAndPassword.getBytes()); 
      //The line which is supposed to add authorization data 
      urlConnection.setRequestProperty ("Authorization", "Basic " + encoding); 

     reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
    } 
    catch (IOException e) { 
     System.err.println("Internet connection failure or invalid Username/Password."); 
     return null; 
    } 
    try { 
     file = new File("file path"); 
     outputStream = new FileOutputStream(file); 
     int character; 
     while((character = reader.read()) != -1) 
     { 
      outputStream.write(character); 
     } 
     outputStream.flush(); 
     outputStream.close(); 
     reader.close(); 
    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
     return null; 
    } 
    System.out.println("downloading completed"); 
    return file; 

} 



public static void main(String args[]) throws MalformedURLException 
{ 
    URL sourceurl = new URL("https:blablabla"); 
    String username = "username"; 
    String password = "password"; 
    String filename = "filename"; 
    WGETServer WGETdownload = new WGETServer(); 
    WGETdownload.download(sourceurl, username, password, filename); 
} 

}

+0

出力ストリームのバッファリングはありませんか? – Jon

答えて

1

あなたはリーダー(グッド)をバッファリングしてきたが、その後、あなたはディスク(BAD)にcharでコンテンツの文字を書きます。それはあなたのパフォーマンスを殺します。それは読書ではなく、それは執筆です。

+0

ああ...私は参照してください...あなたがそれをスピードアップするために提案する任意の代替方法はありますか? – manil

+0

Thorbjørnはあなたの問題に対する解決策を持っています:) –

+0

ya、ちょうどそれを見ました..ありがとうございました。 – manil

4

FileOutputStreamをBufferedOutputStreamでラップします。

new BufferedOutputStream(new FileOutputStream(...))

そうでない場合は書かれて一人ひとりの文字が時間のかかるプロセスである基礎となるオペレーティング・システムによってディスクに同期されます。これがバッファリングが非常に重要な理由です。

+0

ああ、それは助けて..あなたRavnを感謝:) – manil

+0

しかし、ファイルはコードを介してダウンロードするのに5分かかります。しかし、コマンドラインでwgetを使ってファイルをダウンロードすると、同じファイルが4秒でダウンロードされます!!!どうしてこれなの?? – manil

+0

プロファイラを使用して、時間がどこにあるかを確認します。 –

関連する問題