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

画像は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 に答える
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 に答える
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 に答える