JAVA抓取网页的图片到本地后显示错乱
伊谢尔伦
伊谢尔伦 2017-04-18 09:33:00
[Java讨论组]

我尝试从url获取图片然后保存到本地,但是图片显示不正常,而且貌似图片大小比原图会大了一点,这是为什么?

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class DownloadImage {
    public static void main(String[] args){
        BufferedReader bufferedReader = null;
        FileOutputStream fileOutputStream = null;
        URL imageUrl = null;
        String str = null;
        URLConnection urlConnection = null;
        InputStream urlInputStream = null;
        byte[] byteArray = new byte[1024]; 
        File imageFile = null;
        
        try {
            bufferedReader = new BufferedReader(new FileReader("resources/imageURL"));    //这个文件的内容是url地址
            while((str = bufferedReader.readLine()) != null){ 
                imageUrl = new URL(str);
                urlConnection = imageUrl.openConnection();    
                urlConnection.connect();        
                urlInputStream = urlConnection.getInputStream();
                imageFile = new File("resources/image/" + str.substring(str.lastIndexOf("/")+1));
                if(!imageFile.exists()) imageFile.createNewFile();
                fileOutputStream = new FileOutputStream(imageFile);
                while(urlInputStream.read(byteArray) != -1){    
                    fileOutputStream.write(byteArray);
                }
                fileOutputStream.close();
                urlInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("Done!");
        }
    }
}

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(3)
巴扎黑

楼上解释了图片大小的问题,我来说一下可能导致你图片显示不正常的问题。

我看见你的buffer设置的长度是1024,那么会出现什么情况呢?假设一块图片是1028字节,第一次写入buffer是1024全写满,这时你把buffer写入文件是没问题的,但第二次时只读出4个字节,也就是剩下的1020个字节是上次的。可是你仍然把整个buffer都写进文件里,显然是不妥的。

试试将

while(urlInputStream.read(byteArray) != -1){    
    fileOutputStream.write(byteArray);
}

改成

 int ch = 0;
 while((ch = urlInputStream.read(byteArray)) != -1){    
    fileOutputStream.write(byteArray,0,ch);
 }

看看如何

天蓬老师

网站在加载或显示这个图片的时候可能会对图片大小进行处理,所以不一定是原图的大小,你取到得图片才是真正的原图

高洛峰

byte[] byteArray = new byte[这个数字暂时改成大一点的试试,比一张图片稍大即可]

你说图片比原来图片大一点,你直接点图片url 右键另存为,然后跟你代码爬下来的比较一下看看。
如果不一样的话我觉得很可能是因为二进制没写好的问题。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号