java中使用ImageIO.write 写入png图片过慢的调优方案。

ImageIO方法的写入文件流方案

 File file = new File("文件名");
URL url = new URL(file);
  BufferedImage bufferedImage = ImageIO.read(url);
  // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
  ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
 // 这里要注意formatName要缓存后缀名
 ImageIO.write(bufferedImage, suffix, byteArrayOut);
 byte[] data = byteArrayOut.toByteArray();
 // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
 // anchor主要用于设置图片的属性
 HSSFClientAnchor anchor = new HSSFClientAnchor(0, // x缩放
         0, // y缩放
         1023, // 最大1023
         255, // 最大255
         (short) 5, // 宽度占几格 0开始
         i + 4, // 在第几行
         (short) 5, // 宽度占几格 0开始
         i + 4 // 第几列
 );
 patriarch.createPicture(anchor, wb.addPicture(data, XSSFWorkbook.PICTURE_TYPE_PNG));

InputStream方法的写入文件流方法(调优后的方法,通过InputStream替代ImageIO方法)

 File file = new File("文件名");
URL url = new URL(file);
  InputStream bufferedImage = url.openConnection().getInputStream();
  // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
  ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
  // 这里要注意formatName要缓存后缀名
  byte[] data = new byte[1024 * 300];
  int length = 0;
  while ((length = bufferedImage.read(data)) != -1){
      byteArrayOut.write(data, 0, length);
  }
  bufferedImage.close();
  byte[] data1 =byteArrayOut.toByteArray();
  // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
  // anchor主要用于设置图片的属性
  HSSFClientAnchor anchor = new HSSFClientAnchor(0, // x缩放
          0, // y缩放
          1023, // 最大1023
          255, // 最大255
          (short) 5, // 宽度占几格 0开始
          i + 4, // 在第几行
          (short) 5, // 宽度占几格 0开始
          i + 4 // 第几列
  );
  patriarch.createPicture(anchor, wb.addPicture(data1, XSSFWorkbook.PICTURE_TYPE_PNG));

比对发现 调优后 时间从14秒缩短到3秒

你可能感兴趣的:(java,开发语言,后端)