自己圈养小爬虫(四)——下载图片

提取出图片链接存入IMAGE_LIST中之后,下面就需要从中提取链接并下载。

但是在下载的时候发现很多小图片都是logo或者表情,浪费磁盘空间,而且效率底下。所以设置了一个最小大小限制,小于这个大小的图片将会跳过。


DownImage.java主要方法如下:

public boolean saveImage(String url){
    System.out.println("开始下载:" + url);
    if(url == null){
        return false;
    }
    try {
        this.url = new URL(url);
        urlConnection = (HttpURLConnection)this.url.openConnection();
        if(urlConnection.getResponseCode() == 200){
            if(urlConnection.getContentLength() < Config.MIN_SIZE){
                System.out.println("下载图片过小,抛弃:"  + urlConnection.getContentLength());
                return false;
            }
            inputStream = urlConnection.getInputStream();
            fileName =url.substring(url.lastIndexOf("/") + 1);
            File file = new File(Config.IMAGE_PATH , fileName);
            outputStream = new BufferedOutputStream(new FileOutputStream(file));
            while((imageLenght = inputStream.read(imageBuffer)) > 0){
                outputStream.write(imageBuffer, 0, imageLenght);
            }
            System.out.println("下载完成:" + fileName);
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        return true;
    }finally{
        try {
            if(outputStream != null) outputStream.close();
            if(inputStream != null) inputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return true;
}
View Code

 

通过HttpURLConnectio请求连接,它可以实现更复杂的请求。如果只是简单请求的话,可以使用InputStream is = this.url.openStream();

测试,成功!

期间有一个小插曲,因为想要读取出图片的大小,最开始用的是openStream()这种方法,但是openStream()没有直接读取整个文件的方法,只能把数据存入缓冲区。然后我就很贱的在之前尝试读取了一下长度,结果和读取文件一样,读取一次之后,读取的指针就往下移了设置的缓冲区的大小。

后果就是所有下载的图片都无法打开,原因是无法读取到文件头。因为我在第一次读取长度的时候读取到了,然后没有保存,这么弱智的错误害的我找了很长时间的问题。

不明白的查询下InputStream的操作就懂了。

posted @ 2013-08-15 16:59  MNight  阅读(167)  评论(0编辑  收藏  举报