为了增加项目的运行速度我准备把下载的图片存入一个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;
}
}