2013-04-16 21 views
6

私のプログラムにファイルを読み込みたいだけです。このファイルは、作業ディレクトリの上のディレクトリ "../f.fsh"にあります。私はIDEgetResourceAsStream()はJARではなく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 zip圧縮を持っており、それを実行してJARファイルを作成するときにInputStreamReaderを作成する際のInputStreamので、それは、クラッシュしたときに、次のコードは正常に動作します無効である。

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

クラスパスと関係がありますか?私はそれが実行されている瓶の外部のファイルを含めるためだけだと思った。

私も試みたが、中にスラッシュを入れたときに、まだ、失敗していますHow to get a path to a resource in a Java JAR file andfound JARの内容がnecesarilyファイルとしてづけしないかもしれないこと:私は見て

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

。だから私はjarファイル(jarファイルから1つ上のディレクトリ)をコピーしてみましたが、それでも失敗します。いずれにせよ、私はファイルを瓶の中に残して、そこにあるファイルを読むことができるようにしたいと思います。私は何がうまくいかないのか分からない。

答えて

3

..Class.getResourceAsStream()で動作している場合は、Eclipseのバグです。 Eclipseおよび他のIDEは、カスタムクラスローダーを実装して、実行時にプロジェクトからリソースをフェッチします。 Eclipseのクラスローダー実装がgetResourceAsStream()メソッドへの入力時に必要な検証をすべて実行していないようです。この場合はバグがありますが、すべての場合にコードが動作するようにリソースをどのように構造化するかを再考する必要があります。

+0

ありがとうございます。私は自分のファイルの場所を変更し、私のリソースがどこにあるのかを調べて、このエラーをジャーで過ぎ去れました。私は、Eclipseには私の好意でバグがあったとは決して考えなかったでしょう。どうもありがとうございます! – AAB

8

..Class.getResourceAsStream()と使用することはできません。

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

を使用し、クラスと同じパッケージにリソースf.fshをロードするためにSomeClass.class.getResourceAsStream("foo/bar/f.fsh")

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

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

+0

返信いただきありがとうございます。最初にスラッシュを追加するかどうかについて、あなたが言っていることを確認します。 ".."では動作しませんか?それは、私が日食からそれを実行するとき、undestand ".."と思われる。しかし、それは単に瓶から互換性がありません?なぜそれが分かっていますか? – AAB

+1

私はそれが瓶の外で使用されたときに動作することにも驚いています。 javadocでは.. for ...を使用できません。それはちょうどそれが設計されている方法です。 –

+0

ちょうど同じ問題が発生しました。私の推測では、ディスク上のクラスファイルから実行されると、引数は単にOS関数に送られます(わずかに解析される)ので、プロトコルに従わなくても機能します。これはSE6 btwでテストされました。 – user

関連する問題