1. ホーム
  2. java

[解決済み] Javaでクラスパスからテキストファイルを本当に読み込む方法

2022-03-24 08:47:41

質問

システム変数CLASSPATHに設定されているテキストファイルを読み込もうとしています。ユーザー変数ではありません。

私は、以下のようにファイルへの入力ストリームを取得しようとしています。

ファイルのディレクトリに( D:\myDir )をCLASSPATHに追加して、以下をお試しください。

InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");

ファイルのフルパス( D:\myDir\SomeTextFile.txt )をCLASSPATHに登録し、上記3行のコードと同じように試してみてください。

しかし、残念ながらどれもうまくいかず、常に null をInputStreamに入力します。 in .

解決方法は?

クラスパスにあるディレクトリで、同じクラスローダーでロードされたクラスから、どちらかを使用することができるはずです。

// From ClassLoader, all paths are "absolute" already - there's no context
// from which they could be relative. Therefore you don't need a leading slash.
InputStream in = this.getClass().getClassLoader()
                                .getResourceAsStream("SomeTextFile.txt");
// From Class, the path is relative to the package of the class unless
// you include a leading slash, so if you don't want to use the current
// package, include a slash like this:
InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

もし、これらが動作しないのであれば、何か他の問題があることを示唆しています。

そこで、たとえば次のようなコードを考えてみましょう。

package dummy;

import java.io.*;

public class Test
{
    public static void main(String[] args)
    {
        InputStream stream = Test.class.getResourceAsStream("/SomeTextFile.txt");
        System.out.println(stream != null);
        stream = Test.class.getClassLoader().getResourceAsStream("SomeTextFile.txt");
        System.out.println(stream != null);
    }
}

そしてこのディレクトリ構造。

code
    dummy
          Test.class
txt
    SomeTextFile.txt

そして、(私はLinuxボックスを使っているので、Unixのパスセパレータを使用)。

java -classpath code:txt dummy.Test

結果

true
true