Java – Læs en fil fra ressourcemappen
I Java kan vi bruge getResourceAsStream
eller getResource
for at læse en fil eller flere filer fra en resources
-mappe eller rod på klassestien.
Metoden getResourceAsStream
returnerer en InputStream
.
getResource
-metoden returnerer en URL
og konverterer den normalt til en File
; Fungerer ikke i JAR-filen.
Filer i ressourcemappen
1.1 Gennemgå filerne i src/main/resources
, senere får vi adgang til filerne og udskrive filindholdet.
1.2 Som standard skal du oprette værktøjer som Maven, Gradle eller almindelig Java-praksis kopierer alle filer fra src/main/resources
til roden af target/classes
eller build/classes
. Så når vi prøver at læse en fil fra src/main/resources
, læser vi filen fra roden til projektets klassesti.
1.3 Nedenfor er en JAR-filstruktur. Normalt kopieres filerne i resources
-mappen til roden på klassestien.
Hent en fil fra ressourcemappen.
2.1 Eksemplet nedenfor viser brugen af getResourceAsStream
og getResource
metoder til at læse en fil json/file1.json
fra resources
-mappen og udskrive filindholdet.
Bemærk
-
getResource
-metoden fungerer ikke i JAR-filen. -
getResourceAsStream
-metoden fungerer overalt.
Output
2.2 Nu pakker vi projektet i en JAR-fil og kører det; denne gang mislykkes getResource
og returnerer enten NoSuchFileException
eller InvalidPathException
. Vi kan ikke læse filerne inde i JAR-filen via ressource-URL’en.
Kør JAR-filen på Linux (Ubuntu), den kaster NoSuchFileException
.
Kør JAR-filen på Windows, den kaster InvalidPathException
.
PS Denne eksempel bruger Maven-pluginet maven-jar-plugin
til at oprette JAR-filen.
Hent en fil fra ressourcemappen – Enhedstest
3.1 Vi placerer testressourcerne i mappen src/test/resources
til enhedstest. Normalt kopieres filerne i testressourcer til mappen target/test-classes
.
3.2 Det fungerer på samme måde som vi læser filen fra src/main/resources
. Vi bruger de samme getResourceAsStream
og getResource
metoder til at læse filen fra src/test/resources
.
Output
Hent alle filer fra en ressourcemappe. (IKKE-JAR-miljø)
Hvis vi ikke kender det nøjagtige filnavn og vil læse alle filer, inklusive undermappefiler fra en ressourcemappe, kan vi bruge NIO Files.walk
for let at få adgang til og læse filerne.
4.1 Eksemplet nedenfor bruger Files.walk
til at læse alle filer fra en mappe src/main/resources/json
:
Output
4.2 Standard Files.walk
i eksempel 4.1 kan ikke få adgang til filerne i JAR-filen direkte, prøv at køre eksemplet 4.1 i et JAR-miljø, og det kaster FileSystemNotFoundException
.
Hent alle filer fra en ressourcemappe. (JAR-version)
5.1 Dette eksempel viser, hvordan man Files.walk
en mappe inde i en JAR-fil via FileSystems
og URI jar:file:xxx.jar
.
Ideen er:
- Fil fører mappen inde i en JAR-fil ved hjælp af
FileSystems
, og få alt filnavnet, segetPathsFromResourceJAR()
- Loop hele filnavnet, få adgang til og udskriv hver fil som eksempel 2.1, se
getFileFromResourceAsStream()
.
Output
Download 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 – Opret JAR-fil
- Zip File System Provider
- Java Files. Gangeksempler
- Java – Få stien til en kørende JAR-fil
mkyong
Grundlægger af Mkyong.com, elsker Java og open source-ting. Følg ham på Twitter. Hvis du kan lide mine tutorials, så overvej at donere til disse velgørenhedsorganisationer.