Path/Files API
Sissejuhatus
Sarnaselt eelnevale peatükile, siis selleks, et Java programm saaks andmeid lugeda või kirjutada, peab tal olema viis viidata asukohale kettal.
Lisaks File klassile on olemas ka Path ja Files.
Path esindab failisüsteemi asukohti ehk kirjeldab, kus mõni fail asub kettal.
Files abiklass pakub staatilisi meetodeid levinumateks failisüsteemi toiminguteks, olgu selleks siis olemasolu kontroll, failide/kataloogide loomine, nende kustutamine ning omaduste kontrollimine.
Path
Path on liides java.nio.file pakis.
Path objekt ei esinda faili ennast, vaid selle asukohta.
Fail võib olemas olla või mitte - Path loomine ei mõjuta ketast mingil määral.
Path-i saab luua Path.of() meetodi abil:
Path file = Path.of("books.txt");
Path absolute = Path.of("/home/user/data/books.txt");
Path nested = Path.of("data", "library", "books.txt");
Path.of("data", "library", "books.txt") on võrdväärne Path.of("data/library/books.txt")-ile.
Mitme argumendiga vorm liidab lihtsalt kataloogid platvormipõhise eraldusmärgiga, mis teeb koodi operatsioonisüsteemide vahel teisaldatavaks.
- Windowsi puhul on eraldusmärgiks
\, näiteks:C:\Users\Ago\books.txt - macOS ja Linux puhul on eraldusmärgiks
/, näiteks/home/taavi/books.txt
Suhtelised ja absoluutteed
Suhteline tee (relative path) algab aktiivsest kataloogist ehk kataloogist, kust programm käivitati:
Path relative = Path.of("books.txt"); // resolves to <working directory>/books.txt
Absoluuttee (absolute path) algab failisüsteemi juurkataloogist:
Path absolute = Path.of("/home/user/data/books.txt");
Enamus rakenduste failide (andmefailid, konfiguratsioonifailid) puhul peaksid suhtelised teed olema piisavad. Absoluutteed on kasulikud siis, kui faili asukoht on ette teada ja fikseeritud või kui see tuleb väljaspoolt programmi sisendina (nt. käsurea argumendina).
Navigeerimine
Path pakub meetodeid failisüsteemi puu uurimiseks ja selles liikumiseks:
Path path = Path.of("data/library/books.txt");
System.out.println(path.getFileName()); // books.txt
System.out.println(path.getParent()); // data/library
System.out.println(path.getRoot()); // null (relative path has no root)
Path absolute = path.toAbsolutePath(); // full path from filesystem root
Path resolved = path.getParent().resolve("authors.txt"); // data/library/authors.txt
resolve() lisab olemasolevale teele suhtelise teelõigu, mis on kasulik seotud failiteede koostamiseks ilma sõnesid käsitsi liitmata.
Files
Files on abiklass java.nio.file pakis, mis sisaldab staatilisi meetodeid failisüsteemiga suhtlemiseks.
See ei hoia endas olekut, iga meetod viib läbi otsese toimingu failisüsteemis.
Faili olemasolu kontroll
Path path = Path.of("books.txt");
if (Files.exists(path)) {
System.out.println("File exists");
}
if (Files.notExists(path)) {
System.out.println("File does not exist");
}
Files.exists(path) tagastab false mitte ainult siis, kui faili ei ole olemas.
See tagastab false ka juhul, kui programmil puuduvad õigused selle kontrollimiseks.
Sama kehtib ka Files.notExists(path) puhul.
Praktikas selline erisus tähtsust ei oma, kuid selle teadmine võib kasulik olla.
Failiomaduste kontrollimine
Path path = Path.of("books.txt");
boolean isFile = Files.isRegularFile(path);
boolean isDirectory = Files.isDirectory(path);
boolean canRead = Files.isReadable(path);
boolean canWrite = Files.isWritable(path);
long sizeInBytes = Files.size(path); // throws IOException if path does not exist
Failide ja kataloogide loomine
Path file = Path.of("books.txt");
Files.createFile(file); // creates an empty file; throws if it already exists
Path dir = Path.of("data/library");
Files.createDirectory(dir); // creates one directory; parent must exist
Files.createDirectories(dir); // creates the full path including missing parents
Tüüpiliselt luuakse fail ainult siis, kui seda ei eksisteeri:
Path path = Path.of("books.txt");
if (Files.notExists(path)) {
Files.createFile(path);
}
Failide kustutamine
Path path = Path.of("books.txt");
Files.delete(path); // throws NoSuchFileException if the file does not exist
Files.deleteIfExists(path); // deletes if it exists, does nothing otherwise
Kopeerimine ja teiseldamine
Path source = Path.of("books.txt");
Path target = Path.of("backup/books.txt");
Files.copy(source, target); // fails if target exists
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); // overwrites if target exists
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); // moves (rename)
IOException
Peaaegu iga Files klassi meetod võib visata IOException-i, mis on kontrollitud erind ning mille peab kinni püüdma või meetodi signatuuris deklareerima.
See on kontrollitud erind kuna failitoimingud võivad ebaõnnestuda põhjustel, mis ei ole programmi kontrolli all.
Olgu siis selleks, et ketas on täis, fail on teise protsessi poolt lukustatud või tee failini on vale.
try {
Files.createFile(Path.of("books.txt"));
} catch (IOException e) {
System.err.println("Could not create file: " + e.getMessage());
}
Kuidas IOException-i korrektselt käsitleda käsitletakse järgmistes peatükkides.