Prístup k súboru z Classpath v jarnej aplikácii
1. Úvod
V tomto tutoriáli uvidíme rôzne spôsoby prístupu a načítania obsahu súboru, ktorý je na ceste triedy, pomocou Spring.
2. Pomocou Zdroj
The Zdroj rozhranie pomáha pri odoberaní prístupu k zdrojom na nízkej úrovni. V skutočnosti podporuje jednotné spracovanie všetkých druhov súborových zdrojov.
Začnime pohľadom na rôzne metódy na získanie a Zdroj inštancia.
2.1. Ručne
Na prístup k prostriedku z cesty triedy môžeme jednoducho použiť ClassPathResource:
public Resource loadEmployeesWithClassPathResource () {return new ClassPathResource ("data / employees.dat"); }
Predvolene, ClassPathResource odstráni nejaký štandardný štítok na výber medzi kontextovým Classloaderom vlákna a predvoleným systémovým Classloaderom.
Môžeme však tiež naznačiť, že classloader sa má používať buď priamo:
vrátiť nový ClassPathResource ("data / zamestnanci.dat", tento.getClass (). getClassLoader ());
Alebo nepriamo prostredníctvom určenej triedy:
vrátiť nový ClassPathResource ("data / zamestnanci.dat", Employee.class.getClassLoader ());
Všimnite si, že od Zdroj, môžeme ľahko prejsť na štandardné reprezentácie Java ako InputStream alebo Súbor.
Tu si treba uvedomiť ešte jednu vec, že vyššie uvedená metóda funguje iba pre absolútne cesty. Ak chcete určiť relatívnu cestu, môžete prejsť sekundou trieda argument. Cesta bude relatívna k tejto triede:
new ClassPathResource ("../../../ data / employees.dat", Example.class) .getFile ();
Cesta k súboru vyššie je relatívna k Príklad trieda.
2.2. Použitím @Hodnota
Môžeme podať aj a Zdroj s @Hodnota:
@Value ("classpath: data / resource-data.txt") Resource resourceFile;
A @Hodnota podporuje aj ďalšie predpony, napríklad spis: a adresa URL:.
2.3. Pomocou nástroja ResourceLoader
Alebo ak chceme lenivo načítať naše zdroje, môžeme použiť ResourceLoader:
@Autowired ResourceLoader resourceLoader;
A potom získame náš zdroj pomocou getResource:
public Resource loadEmployeesWithResourceLoader () {return resourceLoader.getResource ("classpath: data / Zaměstnanci.dat"); }
Všimnite si tiež ResourceLoader je realizovaný všetkým betónom ApplicationContexts, čo znamená, že sa tiež môžeme jednoducho spoľahnúť ApplicationContext ak to viac vyhovuje našej situácii:
Kontext ApplicationContext; public Resource loadEmployeesWithApplicationContext () {return context.getResource ("classpath: data / Zaměstnanci.dat"); }
3. Používanie ResourceUtils
Výhradou je, že na jar existuje ďalší spôsob, ako získať zdroje, ale ResourceUtils Javadoc je zrejmé, že trieda je určená hlavne na interné použitie.
Ak vidíme zvyklosti z ResourceUtils v našom kóde:
public File loadEmployeesWithSpringInternalClass () hodí FileNotFoundException {return ResourceUtils.getFile ("classpath: data / zaměstnanci.dat"); }
Mali by sme starostlivo zvážiť odôvodnenie ako je asi lepšie použiť jeden zo štandardných prístupov uvedených vyššie.
4. Čítanie údajov o zdrojoch
Keď už máme Zdroj, je pre nás ľahké čítať obsah. Ako sme už diskutovali, môžeme ľahko získať a Súbor alebo an InputStream odkaz z Zdroj.
Poďme si predstaviť, že máme nasledujúci súbor, údaje / zamestnanci.dat, na triednej ceste:
Joe Employee, Jan Employee, James T. Employee
4.1. Čítanie ako a Súbor
Teraz môžeme čítať jeho obsah volaním getFile:
@ Test public void whenResourceAsFile_thenReadSuccessful () vyvolá IOException {File resource = new ClassPathResource ("data / Zaměstnanci.dat"). GetFile (); Pracovníci reťazca = nový reťazec (Files.readAllBytes (resource.toPath ())); assertEquals ("Joe Employee, Jan Employee, James T. Employee", zamestnanci); }
Aj keď si uvedomte, že tento prístup očakáva, že zdroj bude prítomný v súborovom systéme a nie v súbore jar.
4.2. Čítanie ako InputStream
Povedzme však, že náš zdroj je vo vnútri pohára.
Potom môžeme prečítať a Zdroj ako InputStream:
@ Test public void whenResourceAsStream_thenReadSuccessful () vyvolá IOException {InputStream resource = new ClassPathResource ("data / Zaměstnanci.dat"). GetInputStream (); try (čítačka BufferedReader = nový BufferedReader (nový InputStreamReader (zdroj))) {Pracovníci reťazca = reader.lines () .collect (Collectors.joining ("\ n")); assertEquals ("Joe Employee, Jan Employee, James T. Employee", zamestnanci); }}
5. Záver
V tomto rýchlom článku sme videli niekoľko spôsobov, ako získať prístup a prečítať zdroj z cesty triedy pomocou jari, vrátane dychtivého a lenivého načítania a na súborovom systéme alebo v pohári.
A ako vždy, všetky tieto príklady som zverejnil na GitHub.