1

我有一个带有该代码的表格:

public Form() 
{
    initComponents();
    try 
    {
        File file= new File("avatar.jpg");
        BufferedImage image= ImageIO.read(file);
    } 
    catch (IOException ex) 
    {
        System.out.println("Failed to load image");
    }
}

问题是代码总是抛出 IOException 并进入 catch 块。
所以文件没有被读取。
我使用 Netbeans 7.2 创建了项目,目录如下所示:

目录

有什么问题?也许文件不应该在那里,而是在父目录中?要不然是啥?

4

4 回答 4

1

看起来你有一个命名空间,poker.* 这一切都取决于 jvm 的初始化位置。你的主线在哪里?在/Users/ramy/NetBeansProjects/Poker/src吗?

此外,我建议您使用getResource()所有文件加载需求,尤其是在 jar 中。

this.getClass().getResource("/resource/buttons1.png")
or
this.getClass().getResourceAsStream("/resource/TX_Jello2.ttf")

您可以通过执行以下操作找出程序默认路径的位置:

System.getProperty("user.dir");
于 2012-09-12T15:47:52.283 回答
1

您的图像是否被打包在您的 jar 中?要找出这一点,请像提取普通 zip 文件一样提取 jar 文件,并检查图像是否在那里(通常位于jarname\packagename\filename。如果是,那么您需要使用getResourceAsStream().

它会是这样的:

public class Test {
  private static final String absName = "/yourpackage/yourimage.jpg";

  public static void main(String[] args) {
    Class c=null;
    try {
      c = Class.forName("yourpackage.Test");//pkg is the package name in which the resource lies
    } catch (Exception ex) {
      // This should not happen.
    }
    InputStream s = c.getResourceAsStream(absName);
    // do something with it.
  }

    public InputStream getResourceAsStream(String name) {
      name = resolveName(name);
      ClassLoader cl = getClassLoader();
      if (cl==null) {
        return ClassLoader.getSystemResourceAsStream(name); // A system class.
      }
      return cl.getResourceAsStream(name);
    }

    public java.net.URL getResource(String name) {
      name = resolveName(name);
      ClassLoader cl = getClassLoader();
      if (cl==null) {
        return ClassLoader.getSystemResource(name);  // A system class.
      }
      return cl.getResource(name);
    }

    private String resolveName(String name) {
      if (name == null) {
        return name;
      }
      if (!name.startsWith("/")) {
        Class c = this;
        while (c.isArray()) {
          c = c.getComponentType();
        }
        String baseName = c.getName();
        int index = baseName.lastIndexOf('.');
        if (index != -1) {
          name = baseName.substring(0, index).replace('.', '/') + "/" + name;
        }
      } else {
        name = name.substring(1);
      }
      return name;
    }
}

参考:

于 2012-09-12T15:51:22.177 回答
0

如果没有看到错误,我会说最可能的原因是它找不到文件。因此,我建议您将 File 构造函数中的“avatar.jpg”替换为它的绝对文件路径。例如

File file = new File("INSERT_PATH_TO_FILE/avatar.jpg");
于 2012-09-12T15:46:28.263 回答
0

您不能假设图像将“存在”,因为您的 .java 和图像之间的相对路径似乎没问题。

访问资源取决于您的“类型”项目(Web、独立......)。在您的情况下,您可以尝试从类路径中获取图像

final File inputFile = new ClassPathResource("....").getFile();
    final BufferedImage inputImg = ImageIO.read(inputFile);
于 2012-09-12T15:48:18.930 回答