2017-02-21 25 views
1

Я пытаюсь загрузить некоторые изображения, предоставленные хостером. Это метод, который я использую:Слишком большие файлы при загрузке Piktogramms

public static void downloadImage(String imageLink, File f) throws IOException 
{ 
    URL url = new URL(imageLink); 
    byte[] buffer = new byte[1024]; 
    BufferedInputStream in = new BufferedInputStream(url.openStream(), buffer.length); 
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f), buffer.length); 

    while (in.read(buffer) > 0) 
     out.write(buffer); 
    out.flush(); 
    out.close(); 
    in.close(); 
} 

Однако файл оказывается слишком большим. 5MB для 80x60 JPG слишком много, на мой взгляд.

Что может быть причиной этого?

+1

сделайте себе одолжение и использовать библиотеку для этого. Моей любимой для потоковой копии является Apache Commons IOUtils (https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html#copy(java.io. InputStream,% 20java.io.OutputStream)) –

+1

Добро пожаловать; спасибо за быстрое принятие. – GhostCat

+1

И стороны отметить; Я согласен с Томасом: если это не какое-то «упражнение в области образования», вам лучше использовать библиотеку для этого. – GhostCat

ответ

1

Здесь вы делаете неправильно: read() возвращает количество байтов, которые действительно были прочитаны; таким образом, вы должны точно написать это число из вашего массива буферов в поток вывода.

Ваш код повреждает ваш выход; и просто выписывая буферный массив ... который в основном состоит из 0s!

Вместо сделать что-то вроде:

int bytesRead; 
while ((bytesRead = in.read(buffer)) > 0) { 
    byte outBuffer[] = new byte[bytesRead]; 
    ... then use arraycopy to move bytesRead bytes 
    out.write(outBuffer); 
} 

(это означает, как вдохновение, чтобы ты, более псевдо как чем реальный код)

+0

Спасибо. Я обязательно запомню этот факт –