加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 由ImageIO关闭的InputStream

发布时间:2020-12-15 02:12:17 所属栏目:Java 来源:网络整理
导读:我遇到了一个非常奇怪的问题与 ImageIO. 我的java程序中的一些对象有一个Image.我使用静态方法加载通过我的ImageManager加载这些图像. public static Image load(String path){ Image img = null; try { img = ImageIO.read(ImageManager.class.getResource(
我遇到了一个非常奇怪的问题与 ImageIO.

我的java程序中的一些对象有一个Image.我使用静态方法加载通过我的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类中将图像加载到静态变量时也没有问题.但是,只要我从我的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{
    public static Image BACK = ImageManager.load("/textures/cards/back.png");
}

工作得很好.

还有这个:

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方法创建所有实例.
但是为了测试我的加载方法,我快速创建了一个Card实例.

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

任何人都可以告诉我为什么这会产生这样的差异.

顺便说一下这是我的渲染方法.

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

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

    // render actual game

    game.render(g);

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

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

>我确实在项目中添加了一个res文件夹,以便找到图像:?/ res / textures / cards / back.png

解决方法

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

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

希望这可以帮助.

问候,

Slava Imeshev

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读