2 hehe2670 hehe2670 于 2015.06.19 11:48 提问

java 下载图片线程卡死问题,是什么原因, 怎么解决,谢谢
 public static void downLoadImg(String imgName, String imgUrl, String fileURL) throws Exception{
        BufferedInputStream in = null;
        BufferedOutputStream out = null;
        try {
            // 创建流
            System.out.println("imgUrl:" + imgUrl);
            in = new BufferedInputStream( new URL(imgUrl).openStream());
            // 生成图片名
            int index = imgUrl.lastIndexOf("/");
            String sName = imgName == null ? imgUrl.substring(index + 1, imgUrl.length()) : imgName;
            File fir = new File(fileURL);
            if (!fir.exists()) {
                fir.mkdirs();
            }
            // 存放地址
            File img = new File(fileURL + sName);
            // 生成图片
            out = new BufferedOutputStream( new FileOutputStream(img));
            byte[] buf = new byte[2048];
            int length = in.read(buf);
            while (length != -1) {
                out.write(buf, 0, length);
                length = in.read(buf);//在一个下载图片的线程有的时候读取到这里就不动了 ,这种问题应该怎么解决
            }
        } catch (Exception e) {
            System.out.println("下载图片异常");
            e.printStackTrace();
            throw new RuntimeException("下载图片异常");   
        } finally{
            try {
                if( in != null){
                    in.close();
                }
                if(out != null){
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

5个回答

bulusli3
bulusli3   Ds   Rxr 2015.06.19 12:27
已采纳

打印一些信息调试一个那个地方,看有没有死循环。

wumo6556
wumo6556 回复lhl_lqc: 我也有类似情况, 但是我在read()前加上你说的这个判断之后,图片下载下来的不完整。
6 个月之前 回复
hehe2670
hehe2670 回复lhl_lqc: 加上你的判断不会出现死循环问题了,谢谢你
2 年多之前 回复
hehe2670
hehe2670 回复lhl_lqc: 我试下,谢谢
2 年多之前 回复
bulusli3
bulusli3 回复hehe2670: 在停的前面加个判断。if(in.available()!=0){....}else{break;};或者其它能够判断长度的方式,我估计那个地方很可能是已经读完了,但又没有退出,导致一直卡在那里。
2 年多之前 回复
hehe2670
hehe2670 length = in.read(buf);这里停的, 没有死循环
2 年多之前 回复
hehe2670
hehe2670 length = in.read(buf);这里停的, 没有死循环
2 年多之前 回复
chenglei1986
chenglei1986   2015.06.19 12:30

没设超时时间吧,内容不够十个字

hehe2670
hehe2670 哪里设置超时时间?
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.19 12:40

简单测试了一下么有问题啊。检查下图片路径。

hehe2670
hehe2670 在线程中打印了图片路径,最后停的地方用该图片路径就调试,结果也能下载完成, 没有问题,但就是在线程中会出现。。
2 年多之前 回复
hehe2670
hehe2670   2015.06.19 13:22

这是线程调试的地方::::
// 存放地址
File img = new File(fileURL + sName);
// 生成图片
out = new BufferedOutputStream( new FileOutputStream(img));
byte[] buf = new byte[2048];
int length = in.read(buf);
System.out.println(111111111);
while (length != -1) {
System.out.println(222222);
out.write(buf, 0, length);
System.out.println(3333333);
length = in.read(buf);//在一个下载图片的线程有的时候读取到这里就不动了 ,这种问题应该怎么解决
System.out.println(4444444);
}
System.out.println(55555555);

    打印日志:

111111111
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333
4444444
222222
3333333 最后停的地方。。

hehe2670
hehe2670 回复那一抹代码: 就是简单的调用 Utils.downLoadImg(null,bussniess.getbLogo(), imagePath);
2 年多之前 回复
hehe2670
hehe2670 单线程调用的, 图片是网络上的。。
2 年多之前 回复
tongyi55555
tongyi55555 看不出来问题,那就说说你是用在哪里了吧?怎么调用的,是多线程么?图片是本地还是网络的?
2 年多之前 回复
beacon_2011
beacon_2011   Rxr 2015.06.19 11:49

多大的图片呀?理论上不会这样吧

hehe2670
hehe2670 图片不大, 一般的也就十几k左右
2 年多之前 回复
hehe2670
hehe2670 图片不大, 一般的也就十几k左右
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片