Springアプリケーションのクラスパスからファイルにアクセスする
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に載せて]