Загрузка WGET происходит быстрее при выполнении через командную строку и медленно при выполнении через код Java - PullRequest
1 голос
/ 29 марта 2012

Я загружаю файл с помощью WGET через код Java, для загрузки файла размером 20 МБ требуется около 10 минут. Но при выполнении загрузки wget через командную строку тот же файл загружается за 7 секунд со скоростью 10 Мбит / с. Кто-нибудь знает, почему это? Как я могу улучшить свой Java-код?

Ниже приведен код, который я использовал для загрузки файла с помощью WGET. Загрузка файла размером 20 МБ занимает около 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);
}

}

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

Обертывание FileOutputStream с BufferedOutputStream.

new BufferedOutputStream(new FileOutputStream(...))

В противном случае каждый записанный символ синхронизируется с диском базовой операционной системой, что занимает много времени.Вот почему буферизация так важна.

1 голос
/ 29 марта 2012

У вас есть буферизированный ридер (Хорошо), но затем вы записываете содержимое char с char на диск (BAD). Это убивает вашу производительность. Это не чтение, это письмо.

...