8

プログラムにファイルを読み込みたいだけです。このファイルは、「../f.fsh」の作業ディレクトリの 1 つ上のディレクトリにあります。したがって、IDEで実行すると、次のコードが正しく実行されます

String name="../f.fsh";
InputStream is = getClass().getResourceAsStream(name);
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION
BufferedReader br = new BufferedReader(isreader);

しかし、f.fsh が内部に圧縮された JAR ファイルを作成して実行すると、InputStream が null であるため、InputStreamReader の作成時にクラッシュします。

入力ストリームと JAR ファイルに関する質問への回答をたくさん読みましたが、そこから得たのは、相対パスを使用する必要があるということですが、私はすでにそれを行っています。私が理解していることから、 getResourceAsStream() はプロジェクトのルートに関連するファイルを見つけることができます。それが私が望むものです。JAR で機能しないのはなぜですか? 何がうまくいかないのですか、どうすれば修正できますか?

クラスパスと関係がありますか?実行中のjarの外部にあるファイルを含めるためだけだと思いました。

私も試しましたが、スラッシュを入れると失敗します:

InputStream is = getClass().getResourceAsStream("\\"+name);

Java JAR ファイル内のリソースへのパスを取得する方法を調べたところ、JAR の内容が必ずしもファイルとしてアクセスできるとは限らないことがわかりました。そのため、jar に関連するファイル (jar から 1 つ上のディレクトリ) をコピーしてみましたが、それでも失敗します。いずれにせよ、ファイルを jar に残して、そこで読み取れるようにしたいと思います。何が問題なのかわかりません。

4

3 に答える 3

11

..とは併用できませんClass.getResourceAsStream()

f.fshクラスと同じパッケージにリソースをロードするには、次を使用します。SomeClass.class.getResourceAsStream("f.fsh")

f.fshクラスのパッケージのサブパッケージ foo.bar にリソースをロードするには、次を使用します。SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

f.fsh任意のパッケージ com.company.foo.bar にリソースをロードするには、次を使用します。SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

これはgetResource()メソッドの javadoc で説明されていますが、例はありません。

于 2013-04-16T22:07:07.560 に答える
0
  1. ファイル名は大文字と小文字を区別する必要があります
  2. ファイルが Exclipse の外に移動またはコピーされた場合は、プロジェクト エクスプローラーを更新 (F5) する必要があります。
于 2021-02-15T17:23:09.857 に答える