Скачать банку с помощью Java - PullRequest
0 голосов
/ 10 марта 2012

Итак, у меня есть этот набор кода для загрузки файла, кажется, он работает, но загруженный файл поврежден.

          try{
                java.io.BufferedInputStream in = new java.io.BufferedInputStream(new
                    java.net.URL(args[1]).openStream());
                java.io.FileOutputStream fos = new java.io.FileOutputStream(args[2]);
                java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
                byte data[] = new byte[1024];
                int count;
                while( (count = in.read(data,0,1024)) != -1){
                bout.write(data,0,count);
                }
                fos.flush();
                fos.close();
           } 
           catch(Exception e){
           }

args [1] isURL

Ответы [ 4 ]

3 голосов
/ 10 марта 2012

Проблема в том, что вы очищаете и закрываете FileOutputStream, и это оставляет некоторые байты в буфере BufferedOutputStream; Ваши файлы будут отсутствовать где-то между 0 и 1024 байтами в конце. Вместо этого измените оба этих вызова на сброс и закрытие bout, и ваша проблема будет исправлена.


В сторону, это:

catch(Exception e){
}

- это грех программирования высшего порядка и источник многих трудно диагностируемых проблем - не этой, на этот раз, но холодной. Если что-то идет не так во время передачи, сообщение об ошибке будет игнорироваться. Не делай этого - никогда не делай этого.

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

Пустые блоки улова обычно не очень хорошая идея и могут скрывать симптомы.

Change:
    catch(Exception e){ 
    } 
To:
    catch(Exception e){ 
        e.printStackTrace();
    }    
0 голосов
/ 27 июля 2016

После изучения этого простого кода, работающего нормально для системы Windows, в то время как для Mac или другого, вам нужно изменить:

     import java.io.BufferedInputStream;
        import java.io.BufferedOutputStream;
        import java.io.DataInputStream;
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.OutputStream;
        import java.net.HttpURLConnection;
        import java.net.MalformedURLException;
        import java.net.URL;
        import java.net.URLConnection;
        import java.nio.channels.Channels;
        import java.nio.channels.FileChannel;
        import java.nio.channels.ReadableByteChannel;
        import java.nio.charset.MalformedInputException;
        import java.util.Scanner;
        import org.apache.commons.io.FileUtils;

        /**
         *
         * @author aleem
         */
        public class Get {


           public static void main (String[] args) throws IOException, InterruptedException {
          /**Change the url with your jar file url**/
                String fileUrl = "http://elambak.com/Supported.jar";
    /**Assign any name to this newly downloaded file with destination location if required **/


                String destinationFile = "abc1.jar";

                saveFile(fileUrl, destinationFile);

           }
            public static void saveFile(String fileUrl, String destinationFile) throws IOException {
                      int BUFFER_SIZE = 4096;

                URL url = new URL(fileUrl);
                                HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

/** This user agent is using for windows for other OS need to change **/


              httpConn.setRequestProperty("User-Agent", "  Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");

                int responseCode = httpConn.getResponseCode();
                    String disposition = httpConn.getHeaderField("Content-Disposition");
                    String contentType = httpConn.getContentType();
                    int contentLength = httpConn.getContentLength();
                    InputStream is = httpConn.getInputStream();
                OutputStream os = new FileOutputStream(destinationFile);

                    int bytesRead = -1;
                    byte[] buffer = new byte[BUFFER_SIZE];
                    while ((bytesRead = is.read(buffer)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }


            }

        } 
0 голосов
/ 10 марта 2012
  1. Конечно, вы можете скачать .jar.

  2. Если вы успешно загрузите .exe (который является не более чем двоичным потоком байтов, произвольнымдлины), тогда я понятия не имею, почему у вас проблемы с .jar (который также является просто двоичным потоком).С точки зрения вашего потока данных, они должны быть эквивалентны 100%.Я предполагаю, что .exe просто , казалось , чтобы работать ... но вы на самом деле не удалось скопировать некоторые или все файлы.

  3. Наконец, стоит отметитьчто файл ".jar" на самом деле является файлом ".zip".Вы можете обернуть свой поток во встроенный класс Zip и буквально прервать содержимое .jar при чтении файла.Если вы хотите это сделать.

Предложение:

Проверьте размер файла и / или контрольную сумму скопированных вами .exe-файлов.Попробуйте пару разных размеров .exe.Если вы уверены, что .exe копирует правильно, уверяю вас, что .jar тоже должен работать.

...