2

いくつかのtxtファイルを保持する単体テストパッケージがあります。これらは呼び出しによってロードされgetClass().getResource(file);、問題なく動作します。同じフォルダーにcsvファイルを追加しました。その名前をパラメーターとして指定するgetClass().getResource("csvFile.csv");と、nullになります...理由はありますか?

4

2 に答える 2

4

使用するとき

 getClass().getResource("csvFile.csv");

クラスに相対的に見えます。

使用するとき

 getClass().getClassLoader().getResource("csvFile.csv");

クラスパスの最上位ディレクトリを検索します。

2 番目のフォームが必要だと思われます。

Class.getResource(String)から

委任の前に、次のアルゴリズムを使用して、指定されたリソース名から絶対リソース名が構築されます。

  • 名前が「/」(「\u002f」) で始まる場合、リソースの絶対名は、「/」に続く名前の部分です。
  • それ以外の場合、絶対名は次の形式になります。

    modified_pa​​ckage_name/name

    modified_pa​​ckage_name は、「.」を「/」に置き換えたこのオブジェクトのパッケージ名です。('\u002e')。

ご覧のとおり、クラスのパッケージ名のディレクトリ変換が使用されています。


たとえば、コードが下にあるMavenプロジェクトがありますsrc/main/java。私のリソース ディレクトリsrc/main/resources

csvFile.csvクラスパスにコピーされるリソースディレクトリに追加します。

public class B {
    B() {
        URL resource = getClass().getClassLoader().getResource("csvFile.csv");
        System.out.println("Found "+resource);
    }
    public static void main(String... args) {
        new B();
    }
}

印刷する

Found file:/C:/untitled/target/classes/csvFile.csv

これは、resources ディレクトリから maven によって構築された領域にあります。

于 2012-08-21T13:31:52.460 に答える
0

これは、ファイルへのアクセスに使用できる入力ストリームを返しgetClass().getClassLoader().getResourceAsStream(file) ます

于 2012-08-21T13:41:03.267 に答える