将图像从文件读/写到BuffereImage的最快方法? 在Java/Grails中,将图像从文件读入BuffereImage的最快方法是什么 在Java/Grails中,将图像从BuffereImage写入文件的最快方法是什么

将图像从文件读/写到BuffereImage的最快方法? 在Java/Grails中,将图像从文件读入BuffereImage的最快方法是什么 在Java/Grails中,将图像从BuffereImage写入文件的最快方法是什么,java,grails,grails-2.0,javax.imageio,Java,Grails,Grails 2.0,Javax.imageio,我的变体(改为): 我的变体(写): 你几乎擅长写作。只是不要使用中间的ByteArrayOutputStream。这是代码中的一个巨大瓶颈。而是将FileOutputStream包装在BufferedOutputStream中,并执行相同的操作 你的阅读也是如此。删除iTerMedia ByteArrayInputStream。您的读取解决方案基本上是两次读取字节,一次从文件读取,一次从ByteArrayInputStream读取。不要那样做 使用Java7阅读 BufferedImage b

我的变体(改为):

我的变体(写):


你几乎擅长写作。只是不要使用中间的ByteArrayOutputStream。这是代码中的一个巨大瓶颈。而是将FileOutputStream包装在BufferedOutputStream中,并执行相同的操作


你的阅读也是如此。删除iTerMedia ByteArrayInputStream。

您的读取解决方案基本上是两次读取字节,一次从文件读取,一次从
ByteArrayInputStream读取。不要那样做

使用Java7阅读

BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(Paths.get(basePath + imageSource)));
用Java7编写

ImageIO.write(bufferedImage, "jpg", Files.newOutputStream(Paths.get(fullPath)));
调用
Files.newInputStream
将返回一个
ChannelInputStream
,该通道(AFAIK)未被缓冲。你会想把它包起来的

new BufferedInputStream(Files.newInputStream(...));

这样就可以减少对磁盘的IO调用,这取决于您使用磁盘的方式。

我参加聚会迟到了,但无论如何

实际上,使用:

ImageIO.read(new File(basePath + imageSource));

…可能会更快(请使用探查器进行尝试以确保)

这是因为这些变体在幕后使用
RandomAccessFile
支持的
ImageInputStream
/
ImageOutputStream
实现,而基于
InputStream
/
的版本默认情况下将使用磁盘支持的可查找流实现。磁盘备份涉及将流的全部内容写入临时文件,并可能从中读取(这是因为映像I/O通常受益于非线性数据访问)


如果您希望避免使用基于流的版本进行额外的I/O,而以使用更多内存为代价,则可以调用名称模糊的,以禁用可查找输入流的磁盘缓存。如果要处理非常大的图像,这显然不是一个好主意。

我读到Java Toolkit的读取速度非常快,不是吗?如果这是真的,你能修改你的答案吗?@stephan1001很抱歉,我不熟悉与UI相关的软件包。@stephan1001这些是Java 7类。软件包是和。@stephan1001一个未缓冲的
FileInputStream
将进行大量IO操作调用以从磁盘读取。通过缓冲,您可以读取比需要更多的数据,从而减少对磁盘的调用。在这种情况下,这是有意义的,因为您最终还是会读取整个文件。@stephan1001以同样的方式使用相应的
BufferedOutputStream
;比ImageIO.read(新的BufferedInputStream(Files.newInputStream(path.get(basePath+imageSource)))更快;这是真的吗?@stephan1001理论上是的(假设
useCahce
false
的默认设置)。但正如我所说,要确定的是:为了方便起见,我编写了一个示例程序,使用文件版本、流版本和不带磁盘缓存的流版本将中等大小的JPEG读取100次。计时是平均时间。使用文件的时间:36.76ms使用流的时间:40.32ms使用流的时间(useCache==false):在OS X上37.63ms JDK 1.6.0_26-b03-383,2.66GHz i7+SSD。您的想法可能会有所不同…使用BuffereImage的ImageIO进行读写是否会改变图像质量?问题是:当我将jpg图像加载到BuffereImage并将其从该BuffereImage保存回jpg文件时,是否会导致质量损失?
new BufferedInputStream(Files.newInputStream(...));
ImageIO.read(new File(basePath + imageSource));
ImageIO.write(bufferedImage, "jpeg", new File(fullPath));