1前書き

このチュートリアルでは、Springを使用してクラスパス上にあるファイルの内容にアクセスして読み込むためのさまざまな方法を説明します。


2

Resource


を使う


__Resource

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


Resource

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


2.1. 手動で

クラスパスからリソースにアクセスするには、単に

ClassPathResource

を使用します。

public Resource loadEmployees() {
    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

から、

__InputStreamまたは

File__のようなJava標準表現に簡単にジャンプできることに注意してください。


2.2.

@ Value


を使う

また、

@ Value

を使用して

Resource

を注入することもできます。

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

また、

@ Value

は、

file:



url:

のように、他のプレフィックスもサポートしています。


2.3. ResourceLoader

を使用する

あるいは、リソースを遅延ロードしたい場合は、

ResourceLoader

を使用できます。

@Autowired
ResourceLoader resourceLoader;

そして、

getResource

を使ってリソースを取得します。

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


ResourceLoader

はすべての具象

__ApplicationContext


sによって実装されていることにも注意してください。つまり、状況に適した


ApplicationContext

__ifに単純に依存できるということです。

ApplicationContext context;

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


3

ResourceUtils


を使用する

注意点として、Springでリソースを取得する別の方法がありますが、https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/ResourceUtils.html[

ResourceUtils

Javadoc]は次のとおりです。クラスが主に内部使用のためであることを明確にしてください。

私たちのコードで

__ResourceUtils

__の使用法が見られる場合:

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

理論的根拠を慎重に検討する必要があります。** 上記の標準的なアプローチの1つを使用することをお勧めします。


4リソースデータの読み方


__Resourceを取得したら、その内容を読みやすくなります。すでに説明したように、

Resource

から

File

または

InputStream__参照を簡単に取得できます。

クラスパス上に次のファイル

data/employees.dat

があるとします。

__

Joe Employee,Jan Employee,James T. Employee


4.1.

File


として読む

これで、__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の中にあるのだとしましょう。

それから、代わりに

Resource



InputStream

として読み込むことができます。

@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内で見てきました。

そしていつものように、私はこれらすべての例を投稿しましたhttps://github.com/eugenp/tutorials/tree/master/spring-core[GitHubに載せて]