Akses Fail dari Classpath dalam Aplikasi Spring

1. Pengenalan

Dalam tutorial ini, kita akan melihat pelbagai cara untuk mengakses dan memuat kandungan fail yang ada di classpath menggunakan Spring.

2. Menggunakan Sumber

Antara muka Sumber membantu dalam mengaburkan akses ke sumber tahap rendah. Sebenarnya, ia menyokong pengendalian semua jenis sumber fail dengan cara yang seragam.

Mari mulakan dengan melihat pelbagai kaedah untuk mendapatkan contoh Sumber .

2.1. Secara manual

Untuk mengakses sumber dari classpath, kita hanya boleh menggunakan ClassPathResource :

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

Secara lalai, ClassPathResource membuang beberapa plat boiler untuk memilih antara pemuat kelas konteks benang dan pemuat kelas sistem lalai.

Walau bagaimanapun, kami juga dapat menunjukkan pemuat kelas menggunakan sama ada secara langsung:

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

Atau secara tidak langsung melalui kelas yang ditentukan:

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

Perhatikan bahawa dari Sumber , kita dapat dengan mudah beralih ke representasi standard Java seperti InputStream atau File .

Perkara lain yang perlu diperhatikan di sini ialah kaedah di atas hanya berfungsi untuk jalan mutlak. Sekiranya anda ingin menentukan jalan relatif, anda boleh menyampaikan argumen kelas kedua . Laluan akan dibandingkan dengan kelas ini:

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

Laluan fail di atas adalah relatif dengan kelas Contoh .

2.2. Menggunakan @Value

Kami juga dapat menyuntikkan Sumber dengan @Value :

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

Dan @value menyokong awalan lain juga, seperti fail: dan url: .

2.3. Menggunakan ResourceLoader

Atau, jika kita ingin memuatkan sumber kita dengan malas, kita boleh menggunakan ResourceLoader :

@Autowired ResourceLoader resourceLoader;

Dan kemudian kami mendapatkan sumber kami dengan getResource :

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

Perhatikan juga bahawa ResourceLoader dilaksanakan oleh semua ApplicationContext s konkrit , yang bermaksud bahawa kita juga hanya boleh 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 mendapatkan sumber daya pada musim bunga, tetapi ResourceUtils Javadoc jelas bahawa kelas ini terutama untuk kegunaan dalaman.

Sekiranya kita melihat penggunaan ResourceUtils dalam kod kita:

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

Kita harus mempertimbangkan rasionalnya dengan teliti kerana mungkin lebih baik menggunakan salah satu pendekatan standard di atas .

4. Membaca Data Sumber

Sebaik sahaja kita mempunyai Sumber, mudah bagi kita untuk membaca kandungannya. Seperti yang telah kita bahas, kita dapat memperoleh rujukan File atau InputStream dengan mudah dari Sumber .

Bayangkan kita mempunyai fail, data / karyawan.dat berikut , di classpath :

Joe Employee,Jan Employee,James T. Employee

4.1. Membaca sebagai Fail

Sekarang, kita dapat membaca kandungannya 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); }

Walaupun begitu, perhatikan bahawa pendekatan ini mengharapkan sumber tersebut ada dalam sistem fail dan bukan dalam fail jar.

4.2. Membaca sebagai InputStream

Tetapi, katakanlah bahawa sumber daya kita ada di dalam balang.

Kemudian, kita boleh membaca Sumber 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 ringkas ini, kami telah melihat beberapa cara untuk mengakses dan membaca sumber dari jalan kelas menggunakan Spring termasuk memuatkan dengan bersemangat dan malas dan pada sistem fail atau dalam balang.

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