2012-04-23 11 views
2

「res」と呼ばれるリソースフォルダ内の* .txtファイルを読み込み、さまざまな種類のJSONのサブフォルダを含むSwing Javaプログラムがあります。 Eclipseから直接実行すると、すべて正常です。実行可能なjarファイルを作成しても動作しません。私は、恐ろしい解決策で動作させることができました。 実行可能なjarのメインパッケージにないテキストファイルを読み込みます

は、私はこのコード行を使用してそれらを読むには:ファイルが文字列をある

InputStream is = this.getClass().getResourceAsStream(file + ".txt"); 

。私はこれが特定のファイルをjarファイルで検索すると思ったが、明らかにそうではないと思った。私はres/subfolder/name_of_file.txtとサブフォルダ/ name_of_file.txtというファイルにパスを入れようとしましたが、役に立たなかった。 はここに私のプロジェクトcom.packageから

Project 
    src 
     com.package 
    res 
     JSON_type1 
     JSON_type2 
     file.txt 

の構造であり、私はJSON_type2/file.txtをから読み取る必要がありますクラスを持っています。私のテキストファイルをサブフォルダ内に整理しておく明白な理由に加えて、私のGUIはそれらのサブフォルダの内容でドロップダウンリストを入力するということです。

私がここで他の質問から集めたものから、テキストファイルを呼び出すパッケージにテキストファイルを保存したい場合、getResourceAsStream()は私の解決策でした。それ以外には、ClassLoaderのサブクラス化とfindResource()の上書きについて何かを発見しました。可能であれば、私はこのクラスとその機能に精通していないので、このソリューションを避けたいと思います。

詳細が必要な場合はお知らせください。

はあなたに

PSありがとう:この質問はあなたがgetResourceAsStream("/res/JSON_type2/file.txt")

べきfile.txtなどのために、たとえば、スラッシュでそれらを分割することによって、パッケージ内のファイルを扱うことができ、私の前の質問here

答えて

4
// added leading/to indicate search from root of class-path 
String file = "/res/JSON_type2/file.txt"; 
InputStream is = this.getClass().getResourceAsStream(file); 
+0

おそらく私の問題はどこかにあるのかもしれません。このパスを使用するとエラーになりますが、src/com.packageにテキストファイルを置き、 'this.getClass()。getResourceAsStream(" file.txt ");を使用すると動作します。私が別のエラーを探すかもし​​れない考え? – Chamane

+0

それはまだ動作します。しかし、テキストファイルをres/JSON_type2というフォルダに入れて、パッケージcom.packageに入れないようにします。 – Chamane

+0

'file.txt'がJarファイルのどこにあるのかを調べて、Jarが実行中であることを確認しますアプリの-timeクラスパス。これは、コマンドラインからJarの内容をリストしたり、Zipやアーカイブツールを使ってJarの内容を調べることができれば便利です。 –

4

から生まれましたスラッシュはフォルダ構造ではなくプラットフォーム依存ではなく、クラスローダがファイルを扱う方法です。

+0

「フォルダ構造ではない」という意味を明確にすることはできますか?私のテキストファイルは、パスが_res/JSON_type2/file.txt_のフォルダにあります。 _res_をビルドパスに追加しました(そして、サブフォルダJSON_typeXにはこれまで見たことのない装飾が施されています。白いパッケージとオープンフォルダのようです)。ビルドパスに_res_フォルダを追加するとパッケージになるのかどうかわかりませんが、わかっているところからは、コードなしのサブフォルダを持つフォルダだと分かります。いずれにしても、このようなパスを設定すると、InputStreamがnullであるというカスタム例外がスローされます。 – Chamane

+0

確かに、jarファイルのパッケージ構造(またはより一般的なJavaクラスパス)は実際にはフォルダに配置されますが、あなたがそれらに対処するために使用する文字は、紛らわしいものです。あなたがWindows環境に切り替える場合は、クラスローダが実際のフォルダセパレータではなくクラスパス上のパッケージを区切るために使用する文字だけであるため、/を\に変更しないでください。 –

1

私はこれを行うことにより、基本的にはEclipseで探している機能を得ることができた:

src (folder) 
    main (package) 
     ...Classes... 
other (folder) 
    res (package) 
     ...txt files... 

Eclipseが完全にフォルダを無視し、パッケージだけ気遣うようです。 パッケージにテキストファイルを置く限り、getResourceAsStream( "/ res/somefile.txt")を使用してInputStreamを取得できます。

関連する問題