2012-07-01 2 views
2

Я пытаюсь загрузить exe-файл со следующим кодом, любая идея, почему он загружает только ~ 30% файла? По крайней мере, это не исключает никаких исключений.Загрузка двоичного файла Java останавливается раньше

Мой главный метод выглядит следующим образом: new DownloadWorker(). Execute();

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 

import javax.swing.SwingWorker; 

public final class DownloadWorker extends SwingWorker<Object, Object> { 

    @Override 
    protected Object doInBackground() throws Exception { 
     BufferedInputStream in = null; 
     BufferedOutputStream out = null; 

     try { 
      URL url = new URL("http://download.piriform.com/ccsetup320.exe"); 
      URLConnection conn = url.openConnection(); 
      conn.connect(); 

      int fileLength = conn.getContentLength(); 

      in = new BufferedInputStream(url.openStream()); 
      out = new BufferedOutputStream(new FileOutputStream("ccsetup320.exe")); 

      byte[] buffer = new byte[4096]; 
      long total = 0; 
      int bytesRead = 0; 
      while ((bytesRead = in.read(buffer)) != -1) { 
       total += bytesRead; 
       System.out.println((int) (total * 100/fileLength)); 
       out.write(buffer, 0, bytesRead); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (out != null) { 
       out.flush(); 
       out.close(); 
      } 
      if (in != null) { 
       in.close(); 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void done() { 

    } 

} 

Thanks.

+2

Ваш точный код (вырезать и вставлять) работает отлично для меня, предоставляя такой же размер (3,889,704 байт) и сумму MD5 (9039731b97c63d6759bbcbbb14db6ab) для загрузки в Chrome. –

+0

Я использую jdk1.7.0_04, а System.out.println останавливается между 30 и 36, а выходной файл также составляет около 1.3 mb – perak

+0

@perrtuk, ваш код отлично подходит для меня? Он идет до 100, и у меня есть одна и та же версия Java, почему бы не попробовать использовать NIO API для java 7, см. Ниже ответ –

ответ

2

Вы пробовали с помощью Java NIO видела, как у вас есть Java 7 установлено:

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.nio.channels.Channels; 
import java.nio.channels.ReadableByteChannel; 


public class TestApp { 

    public static void main(String[] args) { 
     try { 
      URL url = new URL("http://download.piriform.com/ccsetup320.exe"); 
      ReadableByteChannel rbc = Channels.newChannel(url.openStream()); 
      FileOutputStream fos = new FileOutputStream("c:/ccsetup320.exe"); 
      fos.getChannel().transferFrom(rbc, 0, 1 << 24); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

Приведенные выше код проверен и работает просто отлично, я получил его от подобного вопроса нашел here мы можем увидеть, как NIO делает кодирование намного проще :)

EDIT:

Я обновил код, чтобы использовать SwingWorker и загружает файл без проблем:

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.nio.channels.Channels; 
import java.nio.channels.ReadableByteChannel; 
import javax.swing.SwingWorker; 

public class JavaApplication174 { 

    public static void main(String[] args) { 
     SwingWorker worker = new SwingWorker() { 

      @Override 
      protected Object doInBackground() throws Exception { 

       try { 
        URL google = new URL("http://download.piriform.com/ccsetup320.exe"); 
        ReadableByteChannel rbc = Channels.newChannel(google.openStream()); 
        FileOutputStream fos = new FileOutputStream("c:/ccsetup320.exe"); 
        fos.getChannel().transferFrom(rbc, 0, 1 << 24); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
       return this; 
      } 
     }; 
     worker.run(); 
    } 
} 

EDIT 2:

Вы называете execute() на ваших работников, например использовать run() вместо меня работает!

+0

Это работает, когда выполняется непосредственно из основного метода, но не тогда, когда он находится в SwingWorker, я обновил свой вопрос. – perak

+0

@perttuk Вы могли бы опубликовать код для рабочего –

+0

@perrtuk Я отредактировал код, чтобы включить 'SwingWorker', и, похоже, он работает нормально? –

0

я думаю, что ваша ошибка заключается в этом цикле, поскольку -1 не записывается (т.е. последний байт, отмечающий конец файла):

 while ((bytesRead = in.read(buffer)) != -1) { 
      total += bytesRead; 
      System.out.println((int) (total * 100/fileLength)); 
      out.write(buffer, 0, bytesRead); 
     } 

Изменить это:

 do { 
      bytesRead = in.read(buffer); 
      total += bytesRead; 
      System.out.println((int) (total * 100/fileLength)); 
      out.write(buffer, 0, bytesRead); 
     }while(bytesRead!=-1); 
Смежные вопросы