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.