Springアプリケーションのクラスパスからファイルにアクセスする

Springアプリケーションのクラスパスからファイルにアクセスする

1. 前書き

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

参考文献:

ResourceBundleのガイド

多言語アプリケーションを維持および拡張することは常に困難です。 この記事では、ResourceBundleを使用して、異なるコンテンツに同じコンテンツを提供する必要がある場合に発生する種類に対処する方法について説明します。

Springでリソースを文字列としてロードする

SpringのResourceクラスを使用すると、リソースファイルのコンテンツを文字列としてBeanに挿入する方法を学びます。これは非常に簡単です。

2. Resourceの使用

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

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標準表現に簡単にジャンプできることに注意してください。

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

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

上記のファイルパスは、Exampleクラス.を基準にしています。

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 loadEmployees() {
    return resourceLoader.getResource(
      "classpath:data/employees.dat");
}

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

ApplicationContext context;

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

理論的根拠をit’s probably better to use one of the standard approaches aboveとして慎重に検討する必要があります。

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

Resource, itができたら、内容を簡単に読むことができます。 すでに説明したように、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);
}

ただし、このアプローチはexpects the resource to be present in the filesystem and not within a jar file.であることに注意してください

4.2. InputStreamとして読み取る

ただし、リソースisが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ファイルが含まれます。

そして、いつものように、私はこれらすべての例over on GitHubを投稿しました。