54

を使用してリソース ファイルをロードする方法に従いましたgetClass.getResource(path)。コードのスニペットは次のとおりです。

String url = "Test.properties";

System.out.println("Before printing paths..");
System.out.println("Path2: "+ getClass().getResource(url).getPath());

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
i_propConfig.load(inputStream);
inputStream.close();

階層を使用してEclipseで構成しました(ソースの下にSwingDemoというフォルダーがあります。SwingDemoには、Javaファイルとリソースファイルがあります)...

  1. ソース
    • スイングデモ
      1. CustomDialog.java
      2. Test.properties

これをEclipseで実行しているとき、すべてが正常に実行されています。しかし、コマンドラインからアプリを実行しようとするとすぐにヌルポインター例外が発生します..

コマンド ラインのデプロイ階層は次のとおりです。

フォルダ:D:\Work\Java Progrms\SwingDemo

階層:

  1. スイングデモ
    • CustomDialog.java
    • Test.properties

まず、このファイルSwingDemoをコマンドライン (javac CustomDialog.java) からフォルダー内にコンパイルしました。次に、Java Programs フォルダーに 1 ステップ戻り (.java クラス内のパッケージについて述べたように)、有名なアプリケーションを使用してアプリを実行します。

java SwingDemo.CustomDialog

以前に new FileInputStream("path") を使用したときは、同様の手順に従っていました。この方法を行った後、ヌルポインター例外が発生しています..

getClass().getResource(url)特定のディレクトリからファイルをロードできないと思います。そのため、リソースを Java ファイルと同じディレクトリに配置しました。Eclipseで問題なく動作しました。しかし、コマンドラインから実行するとエラーが発生するのはなぜですか。

4

2 に答える 2

80

getClass().getResource()クラスローダーを使用してリソースをロードします。これは、リソースがロードされるクラスパスにある必要があることを意味します。

Eclipse で実行する場合、ソース フォルダーに入れるものはすべて Eclipse によって「コンパイル」されます。

  • .java ファイルは、bin ディレクトリに移動する .class ファイルにコンパイルされます (デフォルト)。
  • 他のファイルは bin ディレクトリにコピーされます (パッケージ/フォルダーの階層を考慮して)

したがって、Eclipse でプログラムを起動すると、bin ディレクトリがクラスパスに含まれます。このディレクトリには Test.properties ファイルが含まれているため、getResource()またはを使用して、クラス ローダーでこのファイルをロードできますgetResourceAsStream()

コマンドラインから機能しない場合は、ファイルがクラスパスにないためです。

してはいけないことに注意してください

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));

リソースをロードします。ファイルがファイルシステムからロードされた場合にのみ機能するためです。アプリを jar ファイルにパッケージ化する場合、またはネットワーク経由でクラスをロードする場合は機能しません。InputStream を取得するには、単に使用します

getClass().getResourceAsStream("Test.properties")

そして最後に、ドキュメントが示すように、

Foo.class.getResourceAsStream("Test.properties")

クラスFooと同じパッケージにあるTest.propertiesファイルをロードします。

Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")

package にある Test.properties ファイルをロードしますcom.foo.bar

于 2012-12-30T08:05:20.050 に答える
24

jar 内のリソース フォルダーからファイルにアクセスする最良の方法は、 経由で InputStream を使用することgetResourceAsStreamです。ファイル インスタンスとしてリソースが必要な場合は、リソースをストリームとして一時ファイルにコピーできます (一時ファイルは JVM の終了時に削除されます)。

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
于 2016-02-17T19:32:24.140 に答える