踩坑!多个图片存入inputStream集合中再次读取时image为null

为了增加项目的运行速度我准备把下载的图片存入一个inputStream集合中,可以让同样的图片多次被使用。但是在写的时候发现每个is都不为null但是用BufferadImage去读取时发现 image是null的而且不会抛出任何异常,一开始我以为是is被我提前关闭了,然后把所有关闭is的代码都注释了,结果还是不行。后来我尝试在集合中add.(is)的时候new 新的InputStream存入然后将老的is赋值给他,成功的解决了这个问题,重新读取图片不在为null。在此之前我很少接触IO这些,后来通过学习才知道每一个流都是只能被使用一次的,不能进行重复使用,如果想多此使用建议使用byte数组接收。还有就是ByteArrayInputStream中有一个reset()方法也可以将使用过的流回滚流至头部

 public class PictureHandler {
    /**
   * 图片上传
   *
   * @param imageUrlList
   * @throws UnsupportedEncodingException
   */
public void pictureUpload(List<String> imageUrlList, Model model) throws UnsupportedEncodingException {
    List<InputStream> imageIsList = new ArrayList<>(imageUrlList.size());
    for (int i = 0; i < imageUrlList.size(); i++) {
        InputStream inputStream = null;
        ByteArrayOutputStream os = null;
        try {
            //创建连接
            URL url = new URL(imageUrlList.get(i));
            //获取输入流
            inputStream = url.openStream();
            os = new ByteArrayOutputStream();
            Thumbnails.of(inputStream).size(400, 400).toOutputStream(os);//将图片大小压缩
            imageIsList.add(new ByteArrayInputStream(os.toByteArray()));//创建新的is存入
            //图片上传
            PictureUploadResponse rsp = pictureUpload.uploadNetworkImg(new ByteArrayInputStream(os.toByteArray()), model);
            if (rsp != null && rsp.getSubMsg() != null &&
                    (rsp.getSubMsg().indexOf("容量不足") != 1 || "目录不存在".equals(rsp.getSubMsg()))) {
                break;
            }
        } catch (Exception e) {
            logger.error("uploadItemPictures Exception:{}", e.getMessage());
        } finally {
            StreamClose.close(inputStream, os);
        }
    }
    List<BufferedImage> bufferedImages = byIsGetImageBufferedList(imageIsList);//通过输入流生产图片集合
}


/**
 * 通过inputStream集合获取BufferedImage集合
 *
 * @param inputStreams
 * @return
 */
  private static List<BufferedImage> byIsGetImageBufferedList(List<InputStream> inputStreams) {
      List<BufferedImage> imageList = new ArrayList<>();
      for (InputStream is : inputStreams) {
          try {
            //将网络图片的流写入images对应的元素
            //上方如果是直接model.addImageIsList(inputStream);则image会为null
            BufferedImage image = ImageIO.read(is);
            //保存宽度大于等于最小限制宽度的图片
            if (image.getWidth() >= 390) imageList.add(image);
          } catch (IOException e) {
            logger.error("byIsGetImageBufferedList IOException:{}", e.getMessage());
          } finally {
            StreamClose.close(is);
          }
      }
      return imageList;
  }
}

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acmen-zym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值