【发布时间】:2019-06-26 15:13:38
【问题描述】:
我用 Java 创建了一个程序,我想将它打包成一个可执行的 jar 文件。我希望这个程序从 jar 文件中获取图像并显示它们。我创建了一个抽象类,其中包含一个获取字符串文件名并返回图像对象的方法。但是,当我尝试运行此方法时,它会失败并产生“IOException: Stream closed”错误。
我找不到关于为什么关闭流的任何信息。据我所知,我的程序中没有任何其他输入流。在只设置 JFrame 的新 main 中使用该方法仍然会产生相同的错误。
我是否仅通过名称(即“example.png”)或使用其相对路径(即“/src/icons/example.png”)来调用图像文件,或者使用其绝对路径(即“C: /Users/My_Name/Desktop/EXAMPLE/src/icons/example.png") 我收到相同的流关闭错误。
public static Image importImage(String fileName) throws IOException {
Image img = null;
byte[] data = new byte[10000];
BufferedInputStream bis = new BufferedInputStream( Thread.currentThread().getClass().getResourceAsStream(fileName));
int byteRead = bis.read(data, 0, 10000);
img = Toolkit.getDefaultToolkit().createImage(data);
return img;
}
我希望程序接受相关图像文件的名称,并返回一个 Image 对象。图像文件位于项目的类路径中,应该是可见的。
【问题讨论】:
-
因为
Thread.currentThread().getClass().getResourceAsStream(fileName)可能会返回null -
如果 'Thread.currentThread().getClass().getResourceAsStream(fileName)' 返回 null,我应该改用什么?如果我只使用 getClass() ,编译器会出现错误,因为它是非静态方法的静态调用,如果我使用 DEHCImager.class.getResourceAsStream(FileName) 或 Main.class.etc 等,编译器会出现错误,说我没有“主要”方法
-
你可以随意使用任何你想要的东西,但你需要弄清楚要传递的资源名称,以便它真正找到你的图像文件。
-
如果是这样的话,你能给我指一些网站或指南来查找资源的名称吗?
-
试试这个
java.lang.ClassLoader.getResourceAsStream(String name)。同时在try (InputStream is = ...) { ... }中打开资源