0

我正在开发一个每隔一段时间重新加载图像的应用程序。我这样做是为了可以在外部进行更改。我正在使用 ImageIO.read(path) 来读取图像文件。

现在,当我想用​​我的paint.NET 更改图像并尝试保存(覆盖)图像时,paint.NET 会抛出一个 IOException。这可能是因为 ImageIO 只是在进程运行时声称该图像是他的。但这就是我的想法。

代码在这里:

public int width, height;
public int[] pixels;

public Sprite(String ref) {
    try {
        BufferedImage image = ImageIO.read(new FileInputStream(ref));
        width = image.getWidth();
        height = image.getHeight();
        pixels = new int[width * height];
        pixels = image.getRGB(0, 0, width, height, pixels, 0, width);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

任何人都知道如何解决这个问题?

谢谢!

4

1 回答 1

0

在 Windows 上(我假设你在 Windows 上,正如你提到的你使用 Paint.NET),持有一个文件特别有问题,因为它会阻止其他应用程序写入同一个文件。这很可能是您遇到的问题。

当你打开一个流时,就像你在这里做的那样:

new FileInputStream(ref);

您获得了本机文件指针。您有责任在使用后再次关闭它,以释放文件指针。现在,ImageIO.read(InputStream) 应该为您关闭流,但在某些情况下和某些 Java 版本中,存在与此相关的错误。如果流没有正确关闭,Java 进程将持有这个文件指针作为最坏的情况,直到 Java 进程终止。

好消息是,如果您只是将代码更改为:

BufferedImage image = ImageIO.read(new File(ref));

然后ImageIO将始终处理流的打开和关闭。

于 2014-05-09T10:25:33.177 回答