Få tilgang til en fil fra klassestien i en vårapplikasjon

1. Introduksjon

I denne opplæringen ser vi forskjellige måter å få tilgang til og laste innholdet i en fil som er på klassestien ved hjelp av våren.

2. Bruke Ressurs

De Ressurs grensesnitt hjelper med å abstrahere tilgang til ressurser på lavt nivå. Faktisk støtter den håndtering av alle slags filressurser på en enhetlig måte.

La oss starte med å se på ulike metoder for å få tak i en Ressurs forekomst.

2.1. Manuelt

For å få tilgang til en ressurs fra klassestien, kan vi bare bruke ClassPathResource:

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

Som standard, ClassPathResource fjerner noen kjele for å velge mellom trådens kontekst klasselaster og standard system klasselaster.

Vi kan imidlertid også indikere at klasselasteren skal bruke enten direkte:

returner nye ClassPathResource ("data / ansatte.dat", this.getClass (). getClassLoader ());

Eller indirekte gjennom en spesifisert klasse:

returnere nye ClassPathResource ("data / ansatte.dat", Employee.class.getClassLoader ());

Merk at fra Ressurs, kan vi enkelt hoppe til Java standard representasjoner som InputStream eller Fil.

En annen ting å merke seg her er at metoden ovenfor bare fungerer for absolutte baner. Hvis du vil spesifisere en relativ bane, kan du passere et sekund klasse argument. Stien vil være relativt til denne klassen:

ny ClassPathResource ("../../../ data / ansatte.dat", eksempel.klasse) .getFile ();

Filstien ovenfor er i forhold til Eksempel klasse.

2.2. Ved hjelp av @Verdi

Vi kan også injisere en Ressurs med @Verdi:

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

Og @Verdi støtter også andre prefikser, som fil: og url:.

2.3. Bruke ResourceLoader

Eller hvis vi vil laste ressursen vår lat, kan vi bruke den ResourceLoader:

@Autowired ResourceLoader resourceLoader;

Og så henter vi ressursen vår med getResource:

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

Merk også det ResourceLoader er implementert av all konkret ApplicationContexts, noe som betyr at vi også bare kan stole på ApplicationContext hvis det passer bedre for vår situasjon:

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

3. Bruke ResourceUtils

Som en advarsel er det en annen måte å hente ressurser på våren, men ResourceUtils Javadoc er tydelig på at klassen hovedsakelig er til internt bruk.

Hvis vi ser bruk av ResourceUtils i koden vår:

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

Vi bør nøye vurdere begrunnelsen som det er sannsynligvis bedre å bruke en av standardtilnærmingene ovenfor.

4. Lesing av ressursdata

Når vi har en Ressurs, det er lett for oss å lese innholdet. Som vi allerede har diskutert, kan vi enkelt skaffe oss en Fil eller en InputStream referanse fra Ressurs.

La oss forestille oss at vi har følgende fil, data / ansatte.dat, på klassestien:

Joe ansatt, Jan ansatt, James T. ansatt

4.1. Lesing som en Fil

Nå kan vi lese innholdet ved å ringe getFile:

@Test offentlig ugyldig nårResourceAsFile_thenReadSuccessful () kaster IOException {File resource = new ClassPathResource ("data / ansatte.dat"). GetFile (); String ansatte = nye String (Files.readAllBytes (resource.toPath ())); assertEquals ("Joe ansatt, Jan ansatt, James T. ansatt", ansatte); }

Selv om, vær oppmerksom på at denne tilnærmingen forventer at ressursen skal være til stede i filsystemet og ikke i en jar-fil.

4.2. Lesing som en InputStream

La oss si, skjønt, at vår ressurs er inne i en krukke.

Da kan vi i stedet lese a Ressurs som en InputStream:

@Test offentlig ugyldig nårResourceAsStream_thenReadSuccessful () kaster IOException {InputStream ressurs = ny ClassPathResource ("data / ansatte.dat"). GetInputStream (); prøv (BufferedReader reader = new BufferedReader (new InputStreamReader (resource))) {String ansatte = reader.lines () .collect (Collectors.joining ("\ n")); assertEquals ("Joe ansatt, Jan ansatt, James T. ansatt", ansatte); }}

5. Konklusjon

I denne raske artikkelen har vi sett noen måter å få tilgang til og lese en ressurs fra klassestien ved hjelp av Spring, inkludert ivrig og lat lasting og på filsystemet eller i en krukke.

Og som alltid har jeg lagt ut alle disse eksemplene på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found