Java – Les en fil fra ressursmappen
I Java kan vi bruke getResourceAsStream eller getResource for å lese en fil eller flere filer fra en resources -mappe eller roten til klassestien.
getResourceAsStream -metoden returnerer en InputStream.
getResource -metoden returnerer en URL og konverterer den normalt til en File; Fungerer ikke i JAR-fil.
Filer i ressursmappe
1.1 Se gjennom filene i src/main/resources, senere får vi tilgang til filene og skriv ut filinnholdet.
1.2 Som standard bygger du verktøy som Maven, Gradle , eller vanlig Java-praksis, kopierer alle filer fra src/main/resources til roten til target/classes eller build/classes. Så når vi prøver å lese en fil fra src/main/resources, leser vi filen fra roten til prosjektets klassebane.
1.3 Nedenfor er en JAR-filstruktur. Vanligvis kopieres filene i resources -mappen til roten til klassestien.
Få en fil fra ressursmappen.
2.1 Eksemplet nedenfor viser bruken av getResourceAsStream og getResource metoder for å lese en fil json/file1.json fra resources -mappen og skrive ut filinnholdet.
Merk
-
getResource-metoden fungerer ikke i JAR-filen. -
getResourceAsStream-metoden fungerer overalt.
Output
2.2 Nå pakker vi prosjektet i en JAR-fil og kjører det; denne gangen mislykkes getResource og returnerer enten NoSuchFileException eller InvalidPathException. Vi kan ikke lese filene i JAR-filen via ressurs-URL.
Kjør JAR-filen på Linux (Ubuntu), den kaster NoSuchFileException.
Kjør JAR-filen på Windows, den kaster InvalidPathException.
PS Dette eksempel bruker Maven-pluginet maven-jar-plugin for å opprette JAR-filen.
Få en fil fra ressursmappen – Enhetstest
3.1 Vi legger testressursene til mappen src/test/resources for enhetstester. Vanligvis vil filene i testressursene kopiere til target/test-classes -mappen.
3.2 Det fungerer på samme måte som vi leser filen fra src/main/resources. Vi bruker de samme getResourceAsStream og getResource metodene for å lese filen fra src/test/resources.
Output
Få alle filer fra en ressursmappe. (IKKE-JAR-miljø)
Hvis vi ikke vet det eksakte filnavnet og ønsker å lese alle filene, inkludert undermappefiler fra en ressursmappe, kan vi bruke NIO Files.walk for å få lett tilgang til og lese filene.
4.1 Eksemplet nedenfor bruker Files.walk for å lese alle filene fra en mappe src/main/resources/json:
Output
4.2 Standard Files.walk i eksempel 4.1 kan ikke få tilgang til filene i JAR-filen direkte, prøv å kjøre eksemplet 4.1 i et JAR-miljø, og det kaster FileSystemNotFoundException.
Få alle filer fra en ressursmappe. (JAR-versjon)
5.1 Dette eksemplet viser hvordan du Files.walk en mappe i en JAR-fil via FileSystems og URI jar:file:xxx.jar.
Tanken er:
- Fil går mappen i en JAR-fil ved hjelp av
FileSystems, og få alt filnavnet, segetPathsFromResourceJAR() - Løft hele filnavnet, få tilgang til og skriv ut hver fil som eksempel 2.1, se
getFileFromResourceAsStream().
Utgang
Last ned kildekode
$ git klon https://github.com/mkyong/core-java
$ cd java-io
- Files.walk JavaDoc
- CodeSource JavaDoc
- RFC 2396 – Syntaks og format for en URI
- Maven – Opprett JAR-fil
- Zip File System Provider
- Java Files. Gange eksempler
- Java – Få banen til en kjørende JAR-fil
mkyong
Grunnlegger av Mkyong.com, elsker Java og open source-ting. Følg ham på Twitter. Hvis du liker veiledningene mine, kan du vurdere å gi en donasjon til disse veldedighetsorganisasjonene.