Akses File dari Classpath di Aplikasi Spring

1. Perkenalan

Dalam tutorial ini, kita akan melihat berbagai cara untuk mengakses dan memuat konten file yang ada di classpath menggunakan Spring.

2. Menggunakan Resource

The Sumber Daya antarmuka membantu dalam abstrak akses ke sumber daya tingkat rendah. Faktanya, ini mendukung penanganan semua jenis sumber file dengan cara yang seragam.

Mari kita mulai dengan melihat berbagai metode untuk mendapatkan instance Resource .

2.1. Secara manual

Untuk mengakses sumber daya dari classpath, kita cukup menggunakan ClassPathResource :

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

Secara default, ClassPathResource menghapus beberapa boilerplate untuk memilih antara classloader konteks thread dan classloader sistem default.

Namun, kami juga dapat menunjukkan classloader untuk digunakan secara langsung:

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

Atau secara tidak langsung melalui kelas tertentu:

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

Perhatikan bahwa dari Resource , kita dapat dengan mudah melompat ke representasi standar Java seperti InputStream atau File .

Hal lain yang perlu diperhatikan di sini adalah bahwa metode di atas hanya berfungsi untuk jalur absolut. Jika Anda ingin menentukan jalur relatif, Anda bisa meneruskan argumen kelas kedua . Jalurnya akan relatif terhadap kelas ini:

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

Jalur file di atas relatif terhadap kelas Contoh .

2.2. Menggunakan @Value

Kita juga bisa memasukkan Resource dengan @Value :

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

Dan @value mendukung prefiks lainnya, juga, seperti berkas: dan url: .

2.3. Menggunakan ResourceLoader

Atau, jika kita ingin memuat sumber daya kita dengan malas, kita dapat menggunakan ResourceLoader :

@Autowired ResourceLoader resourceLoader;

Dan kemudian kami mengambil sumber daya kami dengan getResource :

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

Perhatikan, juga bahwa ResourceLoader diimplementasikan oleh semua ApplicationContext konkret , yang berarti bahwa kita juga dapat dengan mudah bergantung pada ApplicationContext jika itu lebih sesuai dengan situasi kita:

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

3. Menggunakan ResourceUtils

Sebagai peringatan, ada cara lain untuk mengambil sumber daya di Spring, tetapi ResourceUtils Javadoc jelas bahwa kelas tersebut terutama untuk penggunaan internal.

Jika kita melihat penggunaan ResourceUtils dalam kode kita:

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

Kita harus mempertimbangkan dengan hati-hati alasannya karena mungkin lebih baik menggunakan salah satu pendekatan standar di atas .

4. Membaca Data Sumber Daya

Begitu kita memiliki Sumber Daya, mudah bagi kita untuk membaca isinya. Seperti yang telah kita diskusikan, kita bisa dengan mudah mendapatkan file atau referensi InputStream dari Resource .

Bayangkan kita memiliki file berikut, data / employee.dat , di classpath :

Joe Employee,Jan Employee,James T. Employee

4.1. Membaca sebagai File

Sekarang, kita bisa membaca isinya dengan memanggil 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); }

Meskipun, perhatikan bahwa pendekatan ini mengharapkan sumber daya ada di sistem file dan bukan di dalam file jar.

4.2. Membaca sebagai InputStream

Namun, katakanlah, sumber daya kita ada di dalam toples.

Kemudian, kita bisa membaca Resource sebagai 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. Kesimpulan

Dalam artikel singkat ini, kita telah melihat beberapa cara untuk mengakses dan membaca sumber daya dari classpath menggunakan Spring termasuk eager dan lazy loading dan pada filesystem atau di jar.

Dan, seperti biasa, saya telah memposting semua contoh ini di GitHub.