1. Pathkelas

Jika anda ingin menulis program yang melakukan sesuatu dengan fail pada cakera, itu agak mudah. Java mempunyai banyak kelas yang membantu anda bekerja dengan kedua-dua fail itu sendiri dan kandungannya.

Versi awal Java menggunakan kelas seperti Filedan FileInputStreamuntuk berfungsi dengan fail. Walau bagaimanapun, Filekelas itu kini tidak digunakan dan tidak disyorkan untuk digunakan. Sudah tentu, anda mungkin masih menemuinya dalam kod, parameter kaedah atau pembina kelas.

Sejak awal lagi, kami akan mula belajar cara bekerja dengan fail menggunakan kelas Path. Pathialah kelas yang menggantikan File. Ia lebih selamat dan lebih cekap.

Pathkelas

Secara teknikal, Pathia bukan kelas — ia adalah antara muka. Ini dilakukan untuk membenarkan penulisan keturunan kelas Pathuntuk setiap sistem pengendalian (dan sistem fail).

Windows mempunyai satu standard untuk menulis laluan fail, dan Linux mempunyai satu lagi. Sudah tentu, terdapat banyak sistem pengendalian lain di dunia, dan masing-masing mempunyai standardnya sendiri.

Itulah sebabnya Pathantara muka digunakan di mana-mana dalam kaedah yang berfungsi dengan fail, walaupun pada hakikatnya kerja itu berlaku melalui kelas keturunannya: WindowsPath, UnixPath, ...

Mencipta Pathobjek

Untuk mencipta Pathobjek (yang sebenarnya akan menjadi objek kelas WindowsPathketurunan), anda perlu menggunakan pernyataan seperti ini:

Path name = Path.of(path);

Di manakah namenama pembolehubah Path, dan pathmerupakan laluan ke fail (atau direktori) termasuk nama fail (atau direktori). Dan ofadalah kaedah statik kelas Path.

Kaedah ini of()digunakan untuk mencipta WindowsPathobjek jika program dijalankan pada Windows. Jika program berjalan di Linux, maka UnixPathobjek dicipta. Anda tidak boleh mencipta Pathobjek menggunakan kod seperti .new Path()

Contoh:

Kod Catatan
Path file = Path.of("c:\\projects\\note.txt");
Laluan ke fail
Path directory = Path.of("c:\\projects\\");
Laluan ke direktori

Fail (atau direktori) tidak perlu wujud untuk Pathobjek yang sah wujud. Mungkin anda hanya ingin mencipta fail... PathObjek adalah seperti suped-up String: ia tidak terikat pada fail tertentu pada cakera — ia hanya menyimpan laluan tertentu pada cakera. Itu sahaja.


2. Kaedah Pathjenis

Antara Pathmuka mempunyai beberapa kaedah yang menarik. Yang paling menarik dibentangkan dalam jadual di bawah.

Kaedah Penerangan
Path getParent()
Mengembalikan direktori induk
Path getFileName()
Mengembalikan nama fail tanpa direktori
Path getRoot()
Mengembalikan direktori akar daripada laluan
boolean isAbsolute()
Menyemak sama ada laluan semasa adalah mutlak
Path toAbsolutePath()
Menukar laluan kepada mutlak
Path normalize()
Mengalih keluar kad bebas dalam nama direktori.
Path resolve(Path other)
Membina laluan mutlak baharu daripada laluan mutlak dan relatif.
Path relativize(Path other)
Mendapat laluan relatif daripada dua laluan mutlak.
boolean startsWith(Path other)
Menyemak sama ada laluan semasa bermula dengan laluan tertentu
boolean endsWith(Path other)
Menyemak sama ada laluan semasa berakhir dengan laluan tertentu
int getNameCount()
Pisahkan laluan kepada bahagian menggunakan /sebagai pembatas.
Mengembalikan bilangan bahagian.
Path getName(int index)
Pisahkan laluan kepada bahagian menggunakan /sebagai pembatas.
Mengembalikan bahagian mengikut indeksnya.
Path subpath(int beginIndex, int endIndex)
Pisahkan laluan kepada bahagian menggunakan /sebagai pembatas.
Mengembalikan laluan kecil yang sepadan dengan selang yang diberikan.
File toFile()
Menukar Pathobjek kepada Fileobjek yang tidak digunakan lagi
URI toUri()
Menukar Pathobjek kepada URIobjek

Di bawah adalah penerangan ringkas tentang kaedah sedia ada.


3. Membahagikan laluan kepada bahagian-bahagian

Kaedah ini getParent()mengembalikan laluan yang menunjuk ke direktori induk untuk laluan semasa. Tidak kira sama ada laluan ini ialah direktori atau fail:

Kod Nilai
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

Kaedah ini getFileName()mengembalikan satu nama fail (atau direktori) - apa sahaja yang datang selepas pembatas terakhir:

Kod Nilai
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

Kaedah getRoot()mengembalikan laluan ke direktori akar:

Kod Nilai
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. Laluan mutlak dan relatif

Terdapat dua jenis laluan: mutlak dan relatif. Laluan mutlak bermula dari direktori akar. Untuk Windows, ini mungkin c:\folder; untuk Linux — /direktori

Laluan relatif bermakna berbanding beberapa direktori. Iaitu, ia seperti penghujung jalan, tetapi tanpa permulaan. Anda boleh menukar laluan relatif kepada laluan mutlak dan begitu juga sebaliknya

boolean isAbsolute()kaedah

Kaedah menyemak sama ada laluan semasa adalah mutlak

Kod Nilai
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\codegym\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Path toAbsolutePath()kaedah

Menukar laluan kepada mutlak. Jika perlu, tambahkan direktori kerja semasa kepadanya:

Kod Nilai
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\codegym\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\codegym\\Main.java"

Path normalize()kaedah

Dalam laluan, bukannya nama direktori, anda boleh menulis "..", yang bermaksud kembali satu direktori . Normalisasi menghapuskan perkara-perkara ini. Contoh:

Kod Nilai
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\codegym\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Path relativize(Path other)kaedah

Kaedah ini relativize()membolehkan anda membina "perbezaan antara laluan": satu laluan berbanding yang lain

Kod Nilai
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg");
Path result = path1.relativize(path2);
IllegalArgumentException:
kedua-dua laluan mempunyai "root" yang berbeza (cakera yang berbeza)

Path resolve(Path other)kaedah

Kaedah ini resolve()bertentangan dengan relativize(): ia membina laluan mutlak baharu daripada laluan mutlak dan relatif.

Kod Nilai
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

toFile()kaedah

Kaedah ini mengembalikan Fileobjek yang tidak digunakan lagi yang menyimpan laluan fail yang sama dengan Pathobjek.

toURI()kaedah

Kaedah menukar laluan kepada URI standard dan mengembalikan objek yang mengandungi laluan ke fail:

Laluan ke fail URI ke fail
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt