Toegang tot een bestand vanuit het klassenpad in een Spring-applicatie

1. Inleiding

In deze tutorial zullen we verschillende manieren zien om met Spring toegang te krijgen tot de inhoud van een bestand dat op het klassenpad staat en deze te laden.

2. Met behulp van Bron

De Bron interface helpt bij het abstraheren van toegang tot bronnen op laag niveau. In feite ondersteunt het de verwerking van allerlei soorten bestandsbronnen op een uniforme manier.

Laten we beginnen met het bekijken van verschillende methoden om een Bron voorbeeld.

2.1. Handmatig

Om toegang te krijgen tot een bron vanuit het klassenpad, kunnen we gewoon gebruiken ClassPathResource:

openbare bron loadEmployeesWithClassPathResource () {retourneer nieuwe ClassPathResource ("data / workers.dat"); }

Standaard, ClassPathResource verwijdert enige standaardplaat voor het selecteren tussen de contextklassenlader van de thread en de standaardsysteemklassenlader.

We kunnen echter ook aangeven dat de classloader rechtstreeks moet worden gebruikt:

retourneer nieuwe ClassPathResource ("data / workers.dat", this.getClass (). getClassLoader ());

Of indirect via een bepaalde klasse:

retourneer nieuwe ClassPathResource ("data / workers.dat", Employee.class.getClassLoader ());

Merk op dat van Bron, kunnen we gemakkelijk naar Java-standaardrepresentaties springen, zoals InputStream of het dossier.

Een ander ding om op te merken is dat de bovenstaande methode alleen werkt voor absolute paden. Als u een relatief pad wilt specificeren, kunt u een seconde passeren klasse argument. Het pad is relatief ten opzichte van deze klasse:

nieuwe ClassPathResource ("../../../ data / workers.dat", Example.class) .getFile ();

Het bovenstaande bestandspad is relatief ten opzichte van het Voorbeeld klasse.

2.2. Gebruik makend van @Waarde

We kunnen ook een Bron met @Waarde:

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

En @Waarde ondersteunt ook andere voorvoegsels, zoals het dossier: en url:.

2.3. ResourceLoader gebruiken

Of, als we onze bron lui willen laden, kunnen we gebruiken ResourceLoader:

@Autowired ResourceLoader resourceLoader;

En dan halen we onze bron op met getResource:

openbare bron loadEmployeesWithResourceLoader () {return resourceLoader.getResource ("classpath: data / workers.dat"); }

Merk ook dat op ResourceLoader wordt geïmplementeerd door alle beton ApplicationContexts, wat betekent dat we er ook gewoon op kunnen vertrouwen ApplicationContext als dat beter bij onze situatie past:

ApplicationContext context; openbare bron loadEmployeesWithApplicationContext () {return context.getResource ("classpath: data / workers.dat"); }

3. Met behulp van ResourceUtils

Als voorbehoud is er in het voorjaar een andere manier om bronnen op te halen, maar de ResourceUtils Javadoc is duidelijk dat de klasse voornamelijk voor intern gebruik is.

Als we het gebruik van ResourceUtils in onze code:

openbaar bestand loadEmployeesWithSpringInternalClass () gooit FileNotFoundException {return ResourceUtils.getFile ("classpath: data / workers.dat"); }

We moeten de grondgedachte zorgvuldig overwegen als het is waarschijnlijk beter om een ​​van de bovenstaande standaardbenaderingen te gebruiken.

4. Brongegevens lezen

Zodra we een Bron, het is gemakkelijk voor ons om de inhoud te lezen. Zoals we al hebben besproken, kunnen we gemakkelijk een het dossier of een InputStream referentie van de Bron.

Laten we ons voorstellen dat we het volgende bestand hebben, data / workers.dat, op het klassenpad:

Werknemer Joe, Werknemer Jan, Werknemer James T.

4.1. Lezen als een het dossier

Nu kunnen we de inhoud ervan lezen door te bellen getFile:

@Test openbare leegte whenResourceAsFile_thenReadSuccessful () gooit IOException {File resource = new ClassPathResource ("data / workers.dat"). GetFile (); String medewerkers = nieuwe String (Files.readAllBytes (resource.toPath ())); assertEquals ("Joe-werknemer, Jan-werknemer, James T.-werknemer", werknemers); }

Houd er echter rekening mee dat deze benadering verwacht dat de bron aanwezig is in het bestandssysteem en niet in een jar-bestand.

4.2. Lezen als een InputStream

Laten we echter zeggen dat onze bron is in een pot.

Dan kunnen we in plaats daarvan een Bron als een InputStream:

@Test openbare leegte whenResourceAsStream_thenReadSuccessful () gooit IOException {InputStream resource = nieuwe ClassPathResource ("data / workers.dat"). GetInputStream (); probeer (BufferedReader reader = nieuwe BufferedReader (nieuwe InputStreamReader (resource))) {String medewerkers = reader.lines () .collect (Collectors.joining ("\ n")); assertEquals ("Joe-werknemer, Jan-werknemer, James T.-werknemer", werknemers); }}

5. Conclusie

In dit korte artikel hebben we een paar manieren gezien om met Spring toegang te krijgen tot een bron van het klassenpad en deze te lezen, inclusief gretig en lui laden en op het bestandssysteem of in een jar.

En, zoals altijd, heb ik al deze voorbeelden op GitHub gepost.