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.