java – 将BufferedImage转换为没有I / O的byte []

嗨,我在内存中有一个Buffered Image实例,并希望将其转换为byte []以编码为base64字符串,而不需要I / O操作来执行性能考虑.我正在使用以下API:
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ImageIO.write(image,"png",baos);
return baos.toByteArray();

但是,该API仍然将映像隐含地写入OS临时目录,这将导致在底层OS临时目录已满并且无法创建临时文件时出现故障.
堆栈跟踪:

Caused by: java.io.IOException: No space left on device
    at java.io.RandomAccessFile.write(RandomAccessFile.java:493)
    at javax.imageio.stream.FileCacheImageOutputStream.write(FileCacheImageOutputStream.java:134)
    at javax.imageio.stream.ImageOutputStreamImpl.write(ImageOutputStreamImpl.java:66)
    at com.sun.imageio.plugins.png.PNGImageWriter.write_magic(PNGImageWriter.java:376)
    at com.sun.imageio.plugins.png.PNGImageWriter.write(PNGImageWriter.java:1115)
    at javax.imageio.ImageWriter.write(ImageWriter.java:628)
    at javax.imageio.ImageIO.write(ImageIO.java:1480)
    at javax.imageio.ImageIO.write(ImageIO.java:1554)

在没有I / O的情况下,是否有高效(如内存中转换或高效的I / O)方式进行转换?请指教.

解决方法

通过 ImageIO.setUseCache()方法禁用ImageIO缓存:
ImageIO.setUseCache(false);

认情况下,它是根据javadoc:

Sets a flag indicating whether a disk-based cache file should be used when creating ImageInputStreams and ImageOutputStreams.

When reading from a standard InputStream>,it may be necessary to save prevIoUsly read @R_866_4045@ion in a cache since the underlying stream does not allow data to be re-read. Similarly,when writing to a standard OutputStream,a cache may be used to allow a prevIoUsly written value to be changed before flushing it to the final destination.

The cache may reside in main memory or on disk. Setting this flag to false disallows the use of disk for future streams,which may be advantageous when working with small images,as the overhead of creating and destroying files is removed.

On startup,the value is set to true.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...