首页 > 解决方案 > 如何在 Java 中重用图像并避免大量使用流?

问题描述

我有 5 张图片作为文件,我想在 Vaadin-Grid 的多行中重复使用它们。我注意到我必须按流一次又一次地加载图片才能使其正常工作。以下方式对我不起作用,我无法向我解释。

Image来自com.vaadin.flow.component.html.Image;Vaadin 14)

我像下面这样加载图像。我删除了错误处理以使其更易于阅读。

public static Image loadImage(...) {
        File file = new File(filepath);
        var bufferedImage = ImageIO.read(file);

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, getFileExtension(filepath), bout);

        var bytes = bout.toByteArray();
        StreamResource resource = new StreamResource(defaultNameImage, () -> new ByteArrayInputStream(bytes));

        bout.close();
        return new Image(resource, defaultNameImage);
}

网格的每一行都创建如下(简化):

private Entry createEntry(...) {
    var image = UtilFile.loadImage(PATH_TO_IMAGE, DEFAULT_NAME);
    return new Entry(image);
}

如果我想再次访问图像以在 UI 中显示它,就会出现真正的问题。

    grid.addColumn(new ComponentRenderer<Image, Entry>(entry -> { 
        return entry.getImage(); // Here is the trouble
        }
    })).setHeader("Image");

每行只显示一个图像,而不是 1 个。这是因为流只能使用一次吗?我会猜到 Image 的新实例将具有该图像。我有点困惑,对不起。

现在具体问题:

  1. 为什么我的方法行不通?流是否只使用一次并且 Image 的其他实例没有获取加载的图像?

  2. 是否可以避免大量使用流?我想简单地将图像保存在内存中并重用它。

提前致谢!

标签: javaperformancestreamvaadin

解决方案


推荐阅读