Java ImageIO声明图像
我正在开发一个每隔一段时间重新加载一个图像的应用程序。 我这样做是为了在外出途中做出改变。我正在使用ImageIO.read(path)读取图像文件 现在,当我想用paint.NET更改图像并尝试保存(覆盖)图像时,paint.NET抛出IOException。这可能是因为ImageIO只是在进程运行时声明图像是他的。但我就是这么想的 代码如下:Java ImageIO声明图像,java,javax.imageio,paint.net,Java,Javax.imageio,Paint.net,我正在开发一个每隔一段时间重新加载一个图像的应用程序。 我这样做是为了在外出途中做出改变。我正在使用ImageIO.read(path)读取图像文件 现在,当我想用paint.NET更改图像并尝试保存(覆盖)图像时,paint.NET抛出IOException。这可能是因为ImageIO只是在进程运行时声明图像是他的。但我就是这么想的 代码如下: public int width, height; public int[] pixels; public Sprite(String ref) {
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();
}
}
有人知道怎么解决这个问题吗
谢谢 在Windows上(我假设您使用的是Windows,正如您提到的,您使用的是Paint.NET),保留一个文件尤其有问题,因为它会阻止其他应用程序写入同一个文件。很可能,这就是您遇到的问题
当您打开一条流时,就像您在这里所做的那样:
new FileInputStream(ref);
您可以获取本机文件指针。您有责任在使用后再次关闭它,以释放文件指针。现在,ImageIO.read(InputStream)
应该为您关闭流,但是在某些情况下和某些版本的Java中,存在与此相关的bug。如果流没有正确关闭,Java进程将保留此文件指针,这是最坏的情况,直到Java进程终止
好消息是,如果您只需将代码更改为:
BufferedImage image = ImageIO.read(new File(ref));
然后,
ImageIO
将始终负责流的打开和关闭。哪个操作系统?它似乎有相当多的bug,这些bug仅适用于针对OSX和Linux的Java7,看起来,可能不相关。我认为这个问题的解决方案实际上是微不足道的,请参见下面的答案。ImageIO.read(新文件(ref))
工作正常,谢谢!read(新文件(ref))对我不起作用,我在osx上