图像输入/输出异常:无法读取输入文件。

23
我一周前开始学习Java,现在我想在窗口中插入一张图片。不管我尝试什么方法,在Eclipse中总是出现以下错误:javax.imageio.IIOException: 无法读取输入文件!
package graphics;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import src.Common;

public class Window extends JFrame
{
public class Panel extends JPanel
{

    public void paintComponent(Graphics g)
    {
        Image img; 
        try 
        {
        img = ImageIO.read(new File("/logo.jpg"));
        g.drawImage(img, 0, 0, this);
        } 
        catch (IOException e) 
        {
        e.printStackTrace();
        }

    }
}

public Window(String title, int width, int height)
{
    this.setTitle(title);
    this.setSize(width, height);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setContentPane(new Panel()); 
    this.setVisible(true);
}

我认为这段代码已经很好理解了。 我尝试使用这个那个那个来解决问题。

我正在做一个桌面程序,我的源代码存储在这样的位置: training/src/graphics/Window training/src/src/main

我在每个文件夹中都放置了我想要读取的图像,但仍然遇到了问题:/

我做错了什么?

编辑:最终解决方案如下:

nIcE cOw给了我链接,这对我有所帮助。所以我把我的图片放到了一个文件夹里,并按照链接中所述的方式访问它们。

getClass().getResource("/images/yourImageName.extension");

1
请看一下这个答案。希望它能帮到你 :-) 如果想知道如何访问图片,可以看那个答案中的最后一个链接 :-) - nIcE cOw
你可以在[tag:embedded-resource]标签的info页面上找到有关此内容的更多信息 :-) - nIcE cOw
4个回答

12

你尝试过使用new File("logo.jpg");(没有前导的/)吗?

你确定logo.jpg被复制到输出目录了吗?有些集成开发环境可能不会将您源代码目录中的每个文件都复制到输出(或目标)目录中。

/src
|-> Window.java
|-> Logo.jpg

变成

/out
|-> Window.class

请注意,IDE/编译器不会将图像复制到您的输出目录中,因此编译后的代码无法找到该图像 - 即使您指定了正确的路径。


是的,我确实尝试过(应该提到了)。我是通过Windows用户界面复制“Logo.jpg”的,而不是通过eclipse。 所以你的意思是,我应该从IDE将图像复制到输出文件中?怎么做? :/ - trolologuy
我认为,Eclipse会自动拷贝文件。你的文件必须在项目内吗?如果是在项目内,你可以尝试使用类加载器进行加载。(this.getClass().getResource("images/beam.png")) - deepthought-64

6
尝试调试你实际尝试访问的文件资源。第一步是获取 new File("/logo.jpg").get [Canonical]Path() 并将其打印到 System.out(或在调试器中观察)。我猜问题出在 /logo.jpg 之前,这指向您的根目录(例如 c:),而您的文件不在那里,但我不知道您的文件设置详情。

当我尝试打印时,它什么也不打印 :( 我也尝试了在"Logo.jpg"之前去掉"/",但是没有任何变化。 我的设置是:C:\Documents and Settings\USER\workspace\training\src\graphics - trolologuy
new File(...).getPath() 一定会输出一些内容。如果你不确定,也可以尝试 new File() 或者 new File("")。如果你没有看到任何输出,请尝试在控制台上打印一个随机字符串作为前缀(例如“我的目录是”)来测试。 - LastFreeNickname
最终,我找到了解决方案,我编辑了我的第一篇帖子,但我无法关闭该主题:o 但还是感谢你的帮助! - trolologuy

4
问题在于你在图片之前没有看到任何内容,因此它在查找不存在的文件夹中寻找它。
你需要创建一个文件夹来存储项目中的图像,然后调用它,在图像名称前加上文件夹名称。例如:
ImageIO.read(new File("Folder/Image.png"));

否则,你可以通过遍历整个目录来找到图片,但这并不是一个好方法,因为它需要更长的时间,而且当你移动你的项目时,它将不再是一个有效的链接,因为目录已经改变。例如:
ImageIO.read(new File("D:/eclipse/Workspace/Project/Folder/Image.png"));

创建一个文件夹,让它与源文件夹在同一级别的目录中,并通过调用它来获取图像,如下所示:

文件夹结构;

设置

源文件夹

图像文件夹

二进制文件夹


1

从一个工作中的项目中复制粘贴:

  private JPanel getPanel() {
    JPanel panel = new JPanel();
    JLabel labelLcl = new JLabel("Ye ana!");
    try {
        File f = new File("./src/res/0.jpg");
        //l.a(f.getCanonicalPath());
        BufferedImage imgLcl = ImageIO.read(f);
        ImageIcon iconLcl = new ImageIcon(imgLcl);
        labelLcl.setIcon(iconLcl );
        panel.add(labelLcl);
  } catch (IOException e) {
       e.printStackTrace();
  }
    return panel;
}

否则,您可能会遇到文件夹/文件读取权限问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接