【问题标题】:IOException: StreamClosed Without Apparent CauseIOException:没有明显原因的 StreamClosed
【发布时间】: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 = ...) { ... }中打开资源

标签: java bufferedinputstream


【解决方案1】:

好的。事实证明,这样的方法有两个要求:第一,您必须调用“thisClassName.class.getResourceAsStream(fileName)”。正是这样。您还需要让您的文件名以“/”开头,否则它将完全不起作用。但是,只要您要查找的资源包含在程序的类路径中,它应该从那里工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2013-01-14
    • 2022-11-02
    • 2011-08-28
    相关资源
    最近更新 更多