java – 由ImageIO关闭的InputStream
我遇到了一个非常奇怪的问题与
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方法创建所有实例. 但当我试图加载图像时,它抛出异常.从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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |