Java ImageIO关闭的输入流

Java ImageIO关闭的输入流,java,inputstream,ioexception,javax.imageio,Java,Inputstream,Ioexception,Javax.imageio,我在ImageIO上遇到了一个非常奇怪的问题 我的java程序中有两个对象有一个映像。我使用静态加载方法通过ImageManager加载这些图像 public static Image load(String path){ Image img = null; try { img = ImageIO.read(ImageManager.class.getResource(path)); } catch (IOException e) { //

我在ImageIO上遇到了一个非常奇怪的问题

我的java程序中有两个对象有一个映像。我使用静态加载方法通过ImageManager加载这些图像

public static Image load(String path){
    Image img = null;
    try {
        img = ImageIO.read(ImageManager.class.getResource(path));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if(img == null){
        System.out.println("Image: '" + path + "' not found!");
    }

    return img;
}
无论何时加载(静态)背景图像或在渲染方法中加载图像,都没有问题

另外,当将图像加载到我的Card类中的静态变量中时,也没有问题。但是,一旦我从我的卡构造函数动态加载图像,就会抛出一个异常,表示流已关闭

java.io.IOException: closed
Image: '/textures/cards/back.png' not found!
at javax.imageio.stream.ImageInputStreamImpl.checkClosed(ImageInputStreamImpl.java:110)
at javax.imageio.stream.ImageInputStreamImpl.close(ImageInputStreamImpl.java:857)
at javax.imageio.stream.FileCacheImageInputStream.close(FileCacheImageInputStream.java:250)
at javax.imageio.ImageIO.read(ImageIO.java:1451)
at javax.imageio.ImageIO.read(ImageIO.java:1400)
at visual.gfx.ImageManager.load(ImageManager.java:15)
at visual.Card.<init>(Card.java:49)
at visual.WorldController.render(WorldController.java:98)
at visual.WorldController.run(WorldController.java:116)
at java.lang.Thread.run(Thread.java:745)
很好用

这是:

public class Card{
    private Image image;

    public Card(){
        image = ImageManager.load("/textures/cards/back.png");
    }
}
将结果转换为IOException

有人能告诉我为什么会发生这种情况,以及我如何以不同的方式做事吗?

编辑:

我不知道这个异常是如何发生的,也不知道为什么会发生,但我设法暂时修复了它

我的程序结构如下:

public void run(){
    init();
        while(running){
            update();
            render();
        }
    finish();
}
我计划从init方法加载所有图像并创建所有实例。 但为了测试我的加载方法,我很快创建了
卡的一个实例

但当我试图加载图像时,它抛出了一个异常。从
init()
方法加载图像解决了我的问题

谁能告诉我为什么会有这么大的不同

顺便说一句,这是我的渲染方法

public void render(){
    BufferStrategy bs = getBufferStrategy();
    if(bs == null){
        createBufferStrategy(2);
        bs = getBufferStrategy();
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(background, 0, 0, null);

    // render actual game

    game.render(g);

    // ------------------

    g.dispose();
    bs.show();
}
  • 我确实在项目中添加了一个res文件夹,这样图像就位于:~/res/textures/cards/back.png

Javadoc for ImageIO.read(URL)有点模糊,但它似乎是基于URL在内部缓存输入流,并且它在多线程环境中的行为并不明显

如果我是你,我会给ImageIO.read(InputStream)一个镜头

希望这有帮助

问候,


Slava Imeshev

图像:“/textures/cards/blue1.png”未找到
(“/textures/cards/back.png”)blue1.png!=back.png请解释一下您的类路径中是
/textures/cards/back.png
?您没有加载文件,而是加载类路径资源。@ControlAltDelete这是我使用的两种纹理。我知道它们不一样,但它会导致相同的错误是的,我确实在我的类路径中添加了一个res文件夹。图像位于:~/res/textures/cards/back.pngAre您在Windows、Linux或其他系统上工作吗?路径的大小写是否正确?
ImageIO
(或者,实际上,
ImageInputStream
实现)缓存任何输入流的内容,以便能够在不考虑输入的情况下向后搜索。这种缓存是按流(而不是按URL)进行的,并且是完全线程安全的(从
ImageIO.read(…)
的角度来看)。但是,使用您建议的
ImageIO.read(InputStream)
方法可能有助于找到异常的原因(很可能是资源不存在或不可读)。
public void render(){
    BufferStrategy bs = getBufferStrategy();
    if(bs == null){
        createBufferStrategy(2);
        bs = getBufferStrategy();
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(background, 0, 0, null);

    // render actual game

    game.render(g);

    // ------------------

    g.dispose();
    bs.show();
}