1. 序章

このチュートリアルでは、Springを使用して、クラスパス上にあるファイルのコンテンツにアクセスしてロードするさまざまな方法を示します。

2. リソースの使用

リソースインターフェースは、低レベルのリソースへのアクセスを抽象化するのに役立ちます。 実際、あらゆる種類のファイルリソースの処理を均一にサポートします。

Resourceインスタンスを取得するためのさまざまなメソッドを確認することから始めましょう。

2.1. 手動で

クラスパスからリソースにアクセスするには、ClassPathResourceを使用するだけです。

public Resource loadEmployeesWithClassPathResource() {
    return new ClassPathResource("data/employees.dat");
}

デフォルトでは、 ClassPathResource は、スレッドのコンテキストクラスローダーとデフォルトのシステムクラスローダーのどちらかを選択することにより、ボイラープレートを削除します。

ただし、次のいずれかを直接使用するようにクラスローダーを指定することもできます。

return new ClassPathResource("data/employees.dat", this.getClass().getClassLoader());

または、指定されたクラスを介して間接的に:

return new ClassPathResource(
  "data/employees.dat", 
  Employee.class.getClassLoader());

Resource から、InputStreamFileなどのJava標準表現に簡単にジャンプできることに注意してください。

ここで注意すべきもう1つの点は、上記の方法は絶対パスに対してのみ機能することです。 相対パスを指定する場合は、2番目のclass引数を渡すことができます。 パスはこのクラスに相対的です:

new ClassPathResource("../../../data/employees.dat", Example.class).getFile();

上記のファイルパスは、クラスからの相対パスです。

2.2. @Valueを使用する

Resource@Valueを挿入することもできます。

@Value("classpath:data/resource-data.txt")
Resource resourceFile;

@Value は、 file: url:などの他のプレフィックスもサポートします。

2.3. ResourceLoaderの使用

リソースを遅延ロードする場合は、ResourceLoaderを使用できます。

@Autowired
ResourceLoader resourceLoader;

次に、getResourceを使用してリソースを取得します。

public Resource loadEmployeesWithResourceLoader() {
    return resourceLoader.getResource(
      "classpath:data/employees.dat");
}

ResourceLoader は、すべての具象 ApplicationContext によって実装されることにも注意してください。つまり、状況に適している場合は、ApplicationContextに単純に依存することもできます。

ApplicationContext context;

public Resource loadEmployeesWithApplicationContext() {
    return context.getResource("classpath:data/employees.dat");
}

3. ResourceUtilsを使用する

警告として、Springでリソースを取得する別の方法がありますが、 ResourceUtils Javadoc は、このクラスが主に内部で使用されることを明確にしています。

コードにResourceUtilsの使用法が含まれている場合は、次のようになります。

public File loadEmployeesWithSpringInternalClass() 
  throws FileNotFoundException {
    return ResourceUtils.getFile(
      "classpath:data/employees.dat");
}

上記の標準的なアプローチの1つを使用する方がおそらく良いので、理論的根拠を慎重に検討する必要があります。

4. リソースデータの読み取り

リソースがあれば、内容を簡単に読むことができます。 すでに説明したように、ファイルまたはInputStream参照はリソースから簡単に取得できます。

クラスパスに次のファイルdata/employees.datがあると想像してください。

Joe Employee,Jan Employee,James T. Employee

4.1. ファイルとして読み取る

これで、 getFile:を呼び出すことでその内容を読み取ることができます。

@Test
public void whenResourceAsFile_thenReadSuccessful() 
  throws IOException {
 
    File resource = new ClassPathResource(
      "data/employees.dat").getFile();
    String employees = new String(
      Files.readAllBytes(resource.toPath()));
    assertEquals(
      "Joe Employee,Jan Employee,James T. Employee", 
      employees);
}

ただし、このアプローチは、リソースがjarファイル内ではなくファイルシステム内に存在することを想定していることに注意してください。

4.2. InputStreamとして読み取る

ただし、リソースがjar内にあるとしましょう。

次に、代わりにResourceInputStreamとして読み取ることができます。

@Test
public void whenResourceAsStream_thenReadSuccessful() 
  throws IOException {
    InputStream resource = new ClassPathResource(
      "data/employees.dat").getInputStream();
    try ( BufferedReader reader = new BufferedReader(
      new InputStreamReader(resource)) ) {
        String employees = reader.lines()
          .collect(Collectors.joining("\n"));
 
        assertEquals("Joe Employee,Jan Employee,James T. Employee", employees);
    }
}

5. 結論

この短い記事では、Springを使用してクラスパスからリソースにアクセスして読み取るいくつかの方法を検討しました。 これには、熱心で遅延読み込み、ファイルシステムまたはjarでの読み込みが含まれます。

いつものように、これらの例はすべてGitHub利用できます。