Java 字节数组到缓冲图像转换缓慢

Java 字节数组到缓冲图像转换缓慢,java,bufferedimage,javax.imageio,bytearrayinputstream,Java,Bufferedimage,Javax.imageio,Bytearrayinputstream,我有一个简单的服务器端代码,它接收表示JPEG格式图像的字节数组,并返回图像的尺寸 public String processImage(byte[] data) { long startTime = System.currentTimeMillis(); ByteArrayInputStream stream = new ByteArrayInputStream(data); BufferedImage bufferedImage; bufferedImage

我有一个简单的服务器端代码,它接收表示JPEG格式图像的字节数组,并返回图像的尺寸

public String processImage(byte[] data) {
    long startTime = System.currentTimeMillis();
    ByteArrayInputStream stream = new ByteArrayInputStream(data);
    BufferedImage bufferedImage;
    bufferedImage = ImageIO.read(stream);

    int height = bufferedImage.getHeight();
    int width = bufferedImage.getWidth();

    long endTime = System.currentTimeMillis();

    return "height="+height+" | width="+width+" | elapsed="+(endTime-startTime);
}
这是可行的,但问题是速度太慢了,令人无法接受。对于100KB的图像,需要6秒。对于900KB的图像,需要30秒。这是预期的吗?有没有办法使字节数组到缓冲区的图像转换更快


仅供参考,抓取高度/宽度不是我唯一打算做的事情。我最终想要处理BuffereImage。因此,获取高度/宽度只是一个示例代码。

尝试使用以下命令行选项运行java程序,看看它是否能加快速度:

-Djava.awt.headless=true

你从哪里读图像?字节[]从哪里来?如果您正在从hdd读取图像,使用硬盘读取图像可能会有所帮助

这可以加快加载速度。但这仅在您从文件输入流中读取时有用。当通过tearrayinputstream读取时,它不会有帮助


编辑:您是否可以提供更多信息?字节数组从何而来?

我认为问题可能与ImageIO默认使用磁盘缓存(临时文件)有关,即使您的源是
ByteArrayInputStream
。所以,如果您的文件系统很慢,那么无论输入源是什么,读取也会很慢

您可以使用禁用磁盘缓存(以使用更多内存为代价)。这仍然会缓存您的流(以允许向后搜索),但仅在内存中

如果您有更快的磁盘/ramdisk或类似设备来存储临时文件,还可以使用将缓存目录设置为特定路径

也就是说,您报告的读取时间似乎过高,即使对于磁盘缓存读取也是如此。如果问题仍然存在,我建议使用探查器找出时间花在哪里,并查看可能的优化


PS:如果这真的是问题的话,我还有一个可以帮助减少磁盘访问和内存消耗的自定义设置。

谢谢,我还没有尝试过这个,但是我尝试在一个隔离的环境中运行相同的代码,200KB只需要20毫秒。所以问题看起来不像是代码。上面的设置到底是做什么的?@baekacaek:它将图形卡从等式中去掉。如果您从未计划在显示器上显示BuffereImage,则无需浪费时间将其加载到图形卡的RAM中。我在本地尝试了您的代码片段,上面的命令行选项将我的测试映像上的运行时间从大约250ms减少到大约140ms。字节数组来自HTTP主体,由apache tomcat服务器处理以调用此函数。