【发布时间】:2012-05-01 10:03:41
【问题描述】:
您好,我在内存中有一个 BufferedImage 实例,出于性能考虑,我想将其转换为 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 的情况下进行转换?请指教。
【问题讨论】:
-
我……很惊讶会发生这种情况。
-
这几乎可以肯定是 JVM 中的一个错误。你试过最新版本吗?
-
@PeterLawrey:你为什么认为这是一个错误?有一整班
FileCacheImageOutputStream。但是我根本不知道ImageIO中的这种机制。 -
恕我直言,磁盘缓存在填满驱动器之前不应自动写入数据。你的浏览器最后一次因为它填满你的驱动器而崩溃是什么时候。 ;)
-
有没有办法在不使用 ImageIO 的情况下做到这一点?我遇到了类似的问题,但出于性能原因,我想使用替代方法
标签: java bufferedimage javax.imageio in-memory