Liigu peamise sisu juurde

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).

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");
}
hoiatus

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.