13

この問題はしばらくの間私を悩ませてきました。Javaアプリにいくつかのファイルをロードする必要がありますが、これまでに作業を開始した唯一の方法は次のようになります。

URL hsURL;
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}
else {
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}

しかし、これは醜くてひどいです。しばらくの間、私はこれが機能していると思っていました:

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs");

しかし、それは何らかの理由で機能しなくなりました(私は何かを変更したに違いなく、気づかなかったに違いありません。nullを返します。

getSystemResource()の代わりにgetResource()を使用する必要があります(使用している場合、getSystemResource()は静的ですがgetResource()ではないのはなぜですか?)

私はEclipseを使用していますが、ビルドパス(クラスパス)にフォルダーを含めてみましたが、含めないようにしましたが、違いはないようです。

4

2 に答える 2

26

getSystemResource静的に使用可能なシステムクラスローダーを使用するため、静的です。(ClassLoader.getSystemClassLoader

リソースがクラスパスで利用できる場合は、適切なクラスを使用するClassLoader.getResource()Class.getResource、適切なクラスから使用することをお勧めします。

Foo.class.getResource("/helpsets/helpset.hs");

ClassLoader.getResourceは「絶対」です。Class.getResource接頭辞「/」を付けない限り、クラスのパッケージに相対的です。)

これが機能しない場合は、クラスパスの観点からアプリがどのように構成されているか、およびファイルがどこにあるかを投稿してください。

編集:私は通常、URLよりも有用性が低いと思うので、の代わりInputStreamに使用します。YMMVgetResourceAsStreamgetResource

于 2009-07-13T14:28:07.820 に答える
4

ここでいくつかの異なることについて言及したので、それらを整理しましょう。

1)「user.dir」に基づく「file:」URLの作成

「user.dir」プロパティは、現在の作業ディレクトリを参照します。ユーザーがアプリを起動したときにどこにいてもかまいません。ここに書き込まれたファイルは、2回の実行の間に消える可能性があります(ユーザーが別のディレクトリから実行する可能性があるため)。

「user.home」プロパティは、ユーザーのホームディレクトリを参照します。これは、実行間で同じままである必要があります。

いずれの場合も、Fileオブジェクトを使用してファイルを開き、「file:」URLの作成をいじくり回さないでください。メリットはありません。ご覧のとおり、アクセスするには厄介なコードを作成する必要があります。

2)クラスローダーを介したリソースの取得

これは、アプリケーションにパッケージ化されているファイル(読み取り専用ファイル)を取得するためのものです。ご覧のとおり、複数のバリエーションがあります。クラスはそれと一緒にパッケージ化されたファイルをロードしたいと思うので、私は以下を使用することを好みます。

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
于 2009-07-13T14:30:02.967 に答える