我的变体(阅读):
byte [] imageByteArray = new File(basePath+imageSource).readBytes()
InputStream inStream = new ByteArrayInputStream(imageByteArray)
BufferedImage bufferedImage = ImageIO.read(inStream)
我的变体(写):
BufferedImage bufferedImage = // some image
def fullPath = // image page + file name
byte [] currentImage
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( bufferedImage, "jpg", baos );
baos.flush();
currentImage = baos.toByteArray();
baos.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
def newFile = new FileOutputStream(fullPath)
newFile.write(currentImage)
newFile.close()
答案 0 :(得分:8)
您的阅读解决方案基本上是两次读取字节,一次是从文件读取,一次是从ByteArrayInputStream
读取。不要那样做
使用Java 7阅读
BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(Paths.get(basePath + imageSource)));
用Java 7编写
ImageIO.write(bufferedImage, "jpg", Files.newOutputStream(Paths.get(fullPath)));
对Files.newInputStream
的调用将返回ChannelInputStream
,其中(AFAIK)未缓冲。你想要包装它
new BufferedInputStream(Files.newInputStream(...));
因此,对磁盘的IO调用较少,具体取决于您的使用方式。
答案 1 :(得分:5)
我来晚了,但无论如何......
实际上,使用:
ImageIO.read(new File(basePath + imageSource));
和
ImageIO.write(bufferedImage, "jpeg", new File(fullPath));
...可能会更快(尝试使用分析器确保)。
这是因为这些变体在幕后使用RandomAccessFile
支持的ImageInputStream
/ ImageOutputStream
实现,而基于InputStream
/ OutputStream
的版本将通过default使用磁盘支持的可搜索流实现。磁盘备份涉及将流的全部内容写入临时文件并可能从中读回(这是因为图像I / O通常受益于非线性数据访问)。
如果要避免使用基于流的版本的额外I / O,以使用更多内存为代价,可以调用名称不明确的ImageIO.setUseCache(false)
来禁用磁盘缓存可搜索的输入流。如果你处理非常大的图像,这显然不是一个好主意。
答案 2 :(得分:0)
你写作几乎不错。只是不要使用中间ByteArrayOutputStream。这是代码中的一个巨大瓶颈。而是将FileOutputStream包装在BufferedOutputStream中并执行相同的操作。
你的阅读也是如此。删除Itermediate ByteArrayInputStream。