8 java grails grails-2.0 javax.imageio
我的变种(读):
byte [] imageByteArray = new File(basePath+imageSource).readBytes()
InputStream inStream = new ByteArrayInputStream(imageByteArray)
BufferedImage bufferedImage = ImageIO.read(inStream)
Run Code Online (Sandbox Code Playgroud)
我的变种(写):
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()
Run Code Online (Sandbox Code Playgroud)
您的读取解决方案基本上是两次读取字节,一次是从文件读取,一次是从ByteArrayInputStream.不要那样做
用Java 7来阅读
BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(Paths.get(basePath + imageSource)));
Run Code Online (Sandbox Code Playgroud)
用Java 7来编写
ImageIO.write(bufferedImage, "jpg", Files.newOutputStream(Paths.get(fullPath)));
Run Code Online (Sandbox Code Playgroud)
调用Files.newInputStream将返回一个ChannelInputStream(AFAIK)未缓冲.你想要包装它
new BufferedInputStream(Files.newInputStream(...));
Run Code Online (Sandbox Code Playgroud)
因此,对磁盘的IO调用较少,具体取决于您使用它的方式.
我迟到了,但无论如何......
实际上,使用:
ImageIO.read(new File(basePath + imageSource));
Run Code Online (Sandbox Code Playgroud)
和
ImageIO.write(bufferedImage, "jpeg", new File(fullPath));
Run Code Online (Sandbox Code Playgroud)
...可能会更快(尝试使用分析器确保).
这是因为这些变体在幕后使用RandomAccessFile-backed ImageInputStream/ ImageOutputStreamimplementation,而基于InputStream/ OutputStream的版本默认使用磁盘支持的可搜索流实现.磁盘备份涉及将流的全部内容写入临时文件并可能从中读回(这是因为图像I/O通常受益于非线性数据访问).
如果您希望避免使用基于流的版本的额外I/O,以使用更多内存为代价,可以调用模糊名称ImageIO.setUseCache(false),以禁用可搜索输入流的磁盘缓存.如果你正在处理非常大的图像,这显然不是一个好主意.
| 归档时间: |
|
| 查看次数: |
27317 次 |
| 最近记录: |