2013-12-20 3 views
1

Итак, я искал как скачивать изображения и не получал очень хорошо написанных объяснений, просто примеры кода. Я не совсем понимаю, некоторые из этого кода, в основном сЗагрузка изображений из reddit с ошибками Java

for (int b; (b = is.read()) != -1;) { 
       os.write(b); 
      } 

Может кто-нибудь объяснить этот код выше, как я пять лет, а также любые альтернативы этому методу.

EDIT2

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class Downloader { 
    static String path = "C:\\reddit\\"; 

    public static void main(String[] args) { 
     connect(); 
    } 

    private static void download(String imageURL, int i) { 
     InputStream is = null; 
     OutputStream os = null; 
     try { 
      URL url = new URL(imageURL); 
      is = url.openStream(); 
      os = new FileOutputStream(path + i + ".jpg"); 
      for (int b; (b = is.read()) != -1;) { 
       os.write(b); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (is != null) { 
       try { 
        is.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if (os != null) { 
       try { 
        os.close(); 


     } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public static void connect() { 
    try { 
     Document doc = Jsoup.connect("http://www.reddit.com/r/pics").get(); 
     Elements url = doc.select("a"); 
     int i = 0; 
     for (Element img : url) { 

      if (img.attr("href").startsWith("http://imgur.com/")) { 
       String image = img.attr("abs:href")+".jpg"; 
       System.out.println(image); 
       i++; 
       System.out.println(i); 
       download(image, i); 
      } 
     } 
    } catch (IOException e) { 
     System.out.println("page scrape fail"); 

    } 

} 

}

EDIT я заметил, что мой выход не прав, его написание дубликаты, я просто опубликовать мой консольного результат

http://imgur.com/f7rW2Of 
1 
http://imgur.com/f7rW2Of 
2 
http://imgur.com/35jpkez 
3 
http://imgur.com/35jpkez 
4 
http://imgur.com/IX9HMJG 
5 
http://imgur.com/IX9HMJG 
6 
http://imgur.com/B6MoDbT 
7 
http://imgur.com/B6MoDbT 
8 
http://imgur.com/XMtCUY9 
9 
http://imgur.com/XMtCUY9 
10 
http://imgur.com/UkbbiBl 
11 
http://imgur.com/UkbbiBl 
12 
http://imgur.com/YfLsCal 
13 
http://imgur.com/YfLsCal 
14 
http://imgur.com/9Q3CJtT 
15 
http://imgur.com/9Q3CJtT 
16 
http://imgur.com/Vt7sWTf 
17 
http://imgur.com/Vt7sWTf 
18 
http://imgur.com/hBUH5kS 
19 
http://imgur.com/hBUH5kS 
20 
http://imgur.com/gallery/OWQH0h6 
21 
http://imgur.com/gallery/OWQH0h6 
22 
http://imgur.com/a/hiJXI 
23 
http://imgur.com/a/hiJXI 
24 
+0

Показать фактическую цену. И да, помимо неэффективности чтения одного байта за раз, вы смотрите ОК. –

+0

Вы имеете в виду чтение 1 байт за раз из-за BufferedReader? Я просто удалил это, и я до сих пор не вижу никаких изменений. Каждый файл 29-35kb, ни один из них не может просматривать, даже если я перехожу на jpg. У меня больше нет ошибок, я могу загрузить все 27 изображений с страницы reddit.com/r/pics, просто не могу просмотреть ни одного из них. Можете ли вы eli5 фактической составляющей записи – gallly

+0

Все ли они JPG? –

ответ

0

Вы должны close() СВОИХ OutputStream os и InputStream is; Я бы ввел следующие изменения:

private static void download(String imageURL) { 
    OutputStream os = null;       // <-- Move reference here. 
    InputStream is = null; 
    try { 
     URL url = new URL(imageURL); 
     is = url.openStream(); 
     os = new BufferedOutputStream(new FileOutputStream(
       path+"1")); 
     for (int b; (b = is.read()) != -1;) { 
      os.write(b); 
     } 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (is != null) { 
      try { 
       is.close();       // <-- Call close on InputStream. 
      } catch (Exception e) { 
      } 
     } 
     if (os != null) { 
      try { 
       os.close();       // <-- Call close on OutputStream. 
      } catch (Exception e) { 
      } 
     } 
    } 
} 
+0

Я вносил изменения и не вносил никаких изменений. Его по-прежнему неформальный формат – gallly

Смежные вопросы