Pristupite datoteci s Classpath-a u proljetnoj aplikaciji
1. Uvod
U ovom uputstvu vidjet ćemo razne načine za pristup i učitavanje sadržaja datoteke koja se nalazi na putu predavanja pomoću Springa.
2. Korištenje Resurs
The Resurs sučelje pomaže u apstrahiranju pristupa resursima niske razine. Zapravo, podržava rukovanje svim vrstama resursa datoteka na jedinstven način.
Počnimo s razgledanjem različitih metoda za dobivanje a Resurs primjer.
2.1. Ručno
Za pristup resursu s putova predavanja možemo jednostavno koristiti ClassPathResource:
javni resurs loadEfficieesWithClassPathResource () {return new ClassPathResource ("data / zaposlenici.dat"); }
Prema zadanim postavkama, ClassPathResource uklanja neki obrazac za odabir između kontekstnog učitavača klasa niti i zadanog učitavača sustava.
Međutim, također možemo naznačiti učitač klasa da koristi bilo koji izravno:
vrati novi ClassPathResource ("data / zaposlenici.dat", this.getClass (). getClassLoader ());
Ili posredno kroz navedenu klasu:
vrati novi ClassPathResource ("data / zaposlenici.dat", Employee.class.getClassLoader ());
Imajte na umu da od Resurs, možemo lako prijeći na Java standardne prikaze poput InputStream ili Datoteka.
Ovdje treba napomenuti da gornja metoda djeluje samo za apsolutne putove. Ako želite odrediti relativni put, možete proći i drugi razred argument. Put će biti u odnosu na ovu klasu:
novi ClassPathResource ("../../../ data / zaposlenici.dat", Primjer.klasa) .getFile ();
Gornja putanja datoteke je u odnosu na Primjer razred.
2.2. Koristeći @Vrijednost
Također možemo ubrizgati a Resurs s @Vrijednost:
@Value ("classpath: data / resource-data.txt") Resource resourceFile;
I @Vrijednost podržava i druge prefikse, poput datoteka: i url:.
2.3. Korištenje ResourceLoader-a
Ili, ako želimo lijeno učitati svoj resurs, možemo ga koristiti ResourceLoader:
@Autowired ResourceLoader resourceLoader;
A zatim dohvatimo svoj resurs s getResource:
javni resurs loadEfficieesWithResourceLoader () {return resourceLoader.getResource ("put puta: podaci / zaposlenici.dat"); }
Imajte na umu i to ResourceLoader provodi se svim konkretnim ApplicationContexts, što znači da također možemo jednostavno ovisiti o tome ApplicationContext ako to više odgovara našoj situaciji:
Kontekst ApplicationContext; javni resurs loadEfficieesWithApplicationContext () {return context.getResource ("classpath: data / zaposlenici.dat"); }
3. Korištenje ResourceUtils
Kao upozorenje, postoji još jedan način za dohvaćanje resursa u proljeće, ali ResourceUtils Javadoc je jasno da je klasa uglavnom za internu upotrebu.
Ako vidimo običaje ResourceUtils u našem kodu:
javna datoteka loadEfficieesWithSpringInternalClass () baca FileNotFoundException {return ResourceUtils.getFile ("classpath: data / zaposlenici.dat"); }
Trebali bismo pažljivo razmotriti obrazloženje kao vjerojatno je bolje koristiti jedan od gore navedenih standardnih pristupa.
4. Čitanje podataka resursa
Jednom kad imamo Resurs, lako nam je čitati sadržaj. Kao što smo već razgovarali, lako možemo dobiti a Datoteka ili an InputStream referenca iz Resurs.
Zamislimo da imamo sljedeću datoteku, podaci / zaposlenici.dat, na razrednoj stazi:
Joe zaposlenik, Jan zaposlenik, James T. zaposlenik
4.1. Čitanje kao a Datoteka
Sad njegov sadržaj možemo pročitati pozivima getFile:
@Test public void whenResourceAsFile_thenReadSuccessful () baca IOException {Resurs datoteke = novi ClassPathResource ("data / zaposlenici.dat"). GetFile (); String zaposlenici = novi String (Files.readAllBytes (resource.toPath ())); assertEquals ("Joe Employee, Jan Employee, James T. Employee", zaposlenici); }
Iako, imajte na umu da je ovaj pristup očekuje da će resurs biti prisutan u datotečnom sustavu, a ne unutar jar datoteke.
4.2. Čitanje kao InputStream
Recimo, ipak, da je to naš resurs je unutar staklenke.
Tada umjesto toga možemo pročitati a Resurs kao an InputStream:
@Test public void whenResourceAsStream_thenReadSuccessful () baca IOException {InputStream resource = new ClassPathResource ("data / zaposlenici.dat"). GetInputStream (); probajte (BufferedReader čitač = novi BufferedReader (novi InputStreamReader (resurs))) {String zaposlenici = reader.lines () .collect (Collectors.joining ("\ n")); assertEquals ("Joe Employee, Jan Employee, James T. Employee", zaposlenici); }}
5. Zaključak
U ovom kratkom članku vidjeli smo nekoliko načina za pristup i čitanje resursa s putova predavanja pomoću Springa, uključujući željno i lijeno učitavanje i na datotečnom sustavu ili u staklenci.
Kao i uvijek, sve ove primjere objavio sam na GitHubu.