Java – Läs en fil från resursmappen
I Java kan vi använda getResourceAsStream
eller getResource
för att läsa en fil eller flera filer från en resources
-mapp eller rot till klassvägen.
Metoden getResourceAsStream
returnerar en InputStream
.
getResource
-metoden returnerar en URL
och omvandlar den normalt till en File
; Fungerar inte i JAR-filen.
Filer i resursmappen
1.1 Granska filerna i src/main/resources
, senare kommer vi åt filerna och skriva ut filinnehållet.
1.2 Bygg som standard verktyg som Maven, Gradle eller vanlig Java-övning kommer att kopiera alla filer från src/main/resources
till roten till target/classes
eller build/classes
. Så när vi försöker läsa en fil från src/main/resources
läser vi filen från roten till projektets klassväg.
1.3 Nedan finns en JAR-filstruktur. Vanligtvis kopieras filerna i resources
-mappen till roten till klassvägen.
Hämta en fil från resursmappen.
2.1 Nedanstående exempel visar användningen av getResourceAsStream
och getResource
metoder för att läsa en fil json/file1.json
från resources
-mappen och skriva ut filinnehållet.
Obs
-
getResource
-metoden fungerar inte i JAR-filen. -
getResourceAsStream
-metoden fungerar överallt.
Output
2.2 Nu packar vi projektet i en JAR-fil och kör det; den här gången kommer getResource
att misslyckas och returnerar antingen NoSuchFileException
eller InvalidPathException
. Vi kan inte läsa filerna i JAR-filen via resurs-URL.
Kör JAR-filen på Linux (Ubuntu), den kastar NoSuchFileException
.
Kör JAR-filen på Windows, den kastar InvalidPathException
.
PS Detta exempel använder Maven-plugin maven-jar-plugin
för att skapa JAR-filen.
Hämta en fil från resursmappen – Enhetstest
3.1 Vi lägger testresurserna till mappen src/test/resources
för enhetstester. Vanligtvis kopieras filerna i testresurserna till mappen target/test-classes
.
3.2 Det fungerar på samma sätt som vi läser filen från src/main/resources
. Vi använder samma getResourceAsStream
och getResource
metoder för att läsa filen från src/test/resources
.
Output
Hämta alla filer från en resursmapp. (NON-JAR-miljö)
Om vi inte vet exakt filnamn och vill läsa alla filer, inklusive undermappsfiler från en resursmapp, kan vi använda NIO Files.walk
för att enkelt komma åt och läsa filerna.
4.1 Nedanstående exempel använder Files.walk
för att läsa alla filer från en mapp src/main/resources/json
:
Output
4.2 Standard Files.walk
i exempel 4.1 kan inte komma åt filerna i JAR-filen direkt, försök köra exemplet 4.1 i en JAR-miljö och det kastar FileSystemNotFoundException
.
Hämta alla filer från en resursmapp. (JAR-version)
5.1 Detta exempel visar hur man Files.walk
en mapp i en JAR-fil via FileSystems
och URI jar:file:xxx.jar
.
Tanken är:
- Fil går mappen i en JAR-fil med
FileSystems
, och få allt filnamn, segetPathsFromResourceJAR()
- Loop hela filnamnet, få åtkomst till och skriv ut varje fil som exempel 2.1, se
getFileFromResourceAsStream()
.
Utdata
Hämta källkod
$ git klon https://github.com/mkyong/core-java
$ cd java-io
- Files.walk JavaDoc
- CodeSource JavaDoc
- RFC 2396 – Syntax och format för en URI
- Maven – Skapa JAR-fil
- Zip File System Provider
- Java Files.promenad exempel
- Java – Få sökvägen till en JAR-fil som körs
mkyong
Grundare av Mkyong.com, älskar Java och öppen källkod. Följ honom på Twitter. Om du gillar mina självstudier, överväga att donera till dessa välgörenhetsorganisationer.