Привет У меня есть экземпляр BufferedImage в памяти и вы хотите преобразовать его в байты [] для кодирования в качестве строки base64 без операции ввода-вывода для рассмотрения производительности. Я использую следующий API:Преобразование BufferedImage в байт [] без ввода/вывода
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image,"png",baos);
return baos.toByteArray();
Однако этот API еще неявно записывает изображение во временном каталоге ОС, что приведет к отказу в случае, если основной временный каталог ОС заполнен и временный файл не может быть создано. Трассировка стека:
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)
Есть ли эффективный (например, преобразование в памяти или эффективного ввода/вывода) способ сделать преобразование без ввода/вывода? Пожалуйста, порекомендуйте.
я есть .. что это происходит. –
Это почти наверняка ошибка в JVM. Вы пробовали последнюю версию? –
@PeterLawrey: почему вы считаете это ошибкой? Существует целый класс [FileCacheImageOutputStream'] (http://docs.oracle.com/javase/7/docs/api/javax/imageio/stream/FileCacheImageOutputStream.html). Однако я вообще не знал об этом механизме в «ImageIO». –