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.