1. Pathชั้นเรียน

ถ้าคุณต้องการเขียนโปรแกรมที่ทำบางอย่างกับไฟล์บนดิสก์ นั่นก็ค่อนข้างง่าย Java มีคลาสมากมายที่ช่วยให้คุณทำงานกับทั้งไฟล์และเนื้อหา

Java เวอร์ชันก่อนหน้าใช้คลาสเช่นFileและFileInputStreamเพื่อทำงานกับไฟล์ อย่างไรก็ตามFileคลาสนี้เลิกใช้แล้วและไม่แนะนำให้ใช้ แน่นอน คุณอาจพบมันในโค้ด พารามิเตอร์เมธอด หรือตัวสร้างคลาส

ตั้งแต่เริ่มแรก เราจะเริ่มเรียนรู้วิธีการทำงานกับไฟล์โดยใช้Pathชั้นเรียน Pathเป็นคลาสที่แทนที่File. ปลอดภัยและมีประสิทธิภาพมากขึ้น

Pathระดับ

ในทางเทคนิคแล้วPathไม่ใช่คลาส แต่เป็นอินเทอร์เฟซ สิ่งนี้ทำขึ้นเพื่ออนุญาตให้เขียนลูกหลานของPathคลาสสำหรับแต่ละระบบปฏิบัติการ (และระบบไฟล์)

Windows มีมาตรฐานเดียวสำหรับการเขียนเส้นทางไฟล์ และ Linux มีอีกมาตรฐานหนึ่ง แน่นอนว่ามีระบบปฏิบัติการอื่นๆ มากมายในโลก และแต่ละระบบก็มีมาตรฐานของตัวเอง

นั่นเป็นสาเหตุที่Pathอินเทอร์เฟซถูกใช้ทุกที่ในวิธีการทำงานกับไฟล์ แม้ว่าในความเป็นจริงแล้วงานจะเกิดขึ้นผ่านคลาสที่สืบทอดมา: WindowsPath, UnixPath, ...

การสร้างPathวัตถุ

ในการสร้างPathวัตถุ (ซึ่งจริง ๆ แล้วจะเป็นวัตถุของWindowsPathคลาสที่สืบทอดมา) คุณต้องใช้คำสั่งดังนี้:

Path name = Path.of(path);

nameชื่อของ ตัวแปร อยู่ที่ไหนPathและpathเป็นเส้นทางไปยังไฟล์ (หรือไดเร็กทอรี) รวมถึงชื่อของไฟล์ (หรือไดเร็กทอรี) และofเป็นเมธอดแบบสแตติกของPathคลาส

วิธีการ นี้of()ใช้เพื่อสร้างWindowsPathวัตถุหากโปรแกรมทำงานบน Windows หากโปรแกรมทำงานบน Linux UnixPathวัตถุจะถูกสร้างขึ้น คุณไม่สามารถสร้างPathวัตถุโดยใช้รหัสเช่น.new Path()

ตัวอย่าง:

รหัส บันทึก
Path file = Path.of("c:\\projects\\note.txt");
เส้นทางไปยังไฟล์
Path directory = Path.of("c:\\projects\\");
พาธไปยังไดเร็กทอรี

ไฟล์ (หรือไดเร็กทอรี) ไม่จำเป็นต้องมีอยู่เพื่อให้Pathวัตถุที่ถูกต้องมีอยู่ บางทีคุณอาจต้องการสร้างไฟล์... อPathอบเจกต์ก็เหมือนการเติมข้อมูลString: มันไม่ได้เชื่อมโยงกับไฟล์เฉพาะบนดิสก์ - มันแค่เก็บเส้นทางบางอย่างบนดิสก์ แค่นั้นแหละ.


2. วิธีการPathประเภท

อินPathเทอร์เฟซมีวิธีการที่น่าสนใจค่อนข้างน้อย สิ่งที่น่าสนใจที่สุดแสดงอยู่ในตารางด้านล่าง

วิธี คำอธิบาย
Path getParent()
ส่งคืนไดเร็กทอรีหลัก
Path getFileName()
ส่งกลับชื่อไฟล์โดยไม่มีไดเร็กทอรี
Path getRoot()
ส่งคืนไดเรกทอรีรากจากเส้นทาง
boolean isAbsolute()
ตรวจสอบว่าเส้นทางปัจจุบันเป็นแบบสัมบูรณ์หรือไม่
Path toAbsolutePath()
แปลงเส้นทางเป็นแบบสัมบูรณ์
Path normalize()
ลบสัญลักษณ์แทนในชื่อไดเร็กทอรี
Path resolve(Path other)
สร้างเส้นทางสัมบูรณ์ใหม่จากเส้นทางสัมบูรณ์และสัมพัทธ์
Path relativize(Path other)
รับเส้นทางสัมพัทธ์จากสองเส้นทางสัมบูรณ์
boolean startsWith(Path other)
ตรวจสอบว่าเส้นทางปัจจุบันเริ่มต้นด้วยเส้นทางที่กำหนดหรือไม่
boolean endsWith(Path other)
ตรวจสอบว่าเส้นทางปัจจุบันลงท้ายด้วยเส้นทางที่กำหนดหรือไม่
int getNameCount()
แยกพาธออกเป็นส่วนๆ โดยใช้/เป็นตัวคั่น
ส่งกลับจำนวนชิ้นส่วน
Path getName(int index)
แยกพาธออกเป็นส่วนๆ โดยใช้/เป็นตัวคั่น
คืนค่าส่วนหนึ่งตามดัชนี
Path subpath(int beginIndex, int endIndex)
แยกพาธออกเป็นส่วนๆ โดยใช้/เป็นตัวคั่น
ส่งกลับเส้นทางย่อยที่สอดคล้องกับช่วงเวลาที่กำหนด
File toFile()
แปลงPathวัตถุให้เป็นFileวัตถุ ที่เลิกใช้แล้ว
URI toUri()
แปลงPathวัตถุเป็นURIวัตถุ

ด้านล่างนี้เป็นคำอธิบายโดยย่อของวิธีการที่มีอยู่


3. แบ่งเส้นทางออกเป็นส่วนๆ

วิธีgetParent()การส่งคืนเส้นทางที่ชี้ไปยังไดเร็กทอรีหลักสำหรับเส้นทางปัจจุบัน ไม่ว่าพาธนี้จะเป็นไดเร็กทอรีหรือไฟล์ก็ตาม:

รหัส ค่า
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

เมธอดgetFileName()ส่งคืนชื่อไฟล์เดียว (หรือไดเร็กทอรี) — อะไรก็ตามที่อยู่หลังตัวคั่นสุดท้าย:

รหัส ค่า
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

เมธอดgetRoot()ส่งคืนพาธไปยังไดเร็กทอรีรูท:

รหัส ค่า
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. เส้นทางสัมบูรณ์และสัมพัทธ์

เส้นทางมีสองประเภท: แบบสัมบูรณ์และแบบสัมพัทธ์ เส้นทางที่แน่นอนเริ่มต้นจากไดเร็กทอรีรูท สำหรับ Windows นี่อาจเป็นc:\โฟลเดอร์ สำหรับ Linux — /ไดเร็กทอรี

เส้นทางสัมพัทธ์มีความหมายโดยสัมพันธ์กับบางไดเร็กทอรี นั่นคือมันเหมือนจุดสิ้นสุดของถนน แต่ไม่มีจุดเริ่มต้น คุณสามารถเปลี่ยนเส้นทางสัมพัทธ์ให้เป็นเส้นทางสัมบูรณ์และในทางกลับกันได้

boolean isAbsolute()วิธี

เมธอดตรวจสอบว่าเส้นทางปัจจุบันเป็นแบบสัมบูรณ์หรือไม่

รหัส ค่า
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()วิธี

แปลงเส้นทางเป็นแบบสัมบูรณ์ หากจำเป็น ให้เพิ่มไดเร็กทอรีการทำงานปัจจุบัน:

รหัส ค่า
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()วิธี

ในเส้นทาง แทนที่จะเป็นชื่อไดเร็กทอรี คุณสามารถเขียน ".." ซึ่งหมายถึงย้อนกลับหนึ่งไดเร็กทอรี การทำให้เป็นมาตรฐานจะกำจัดสิ่งเหล่านี้ ตัวอย่าง:

รหัส ค่า
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)วิธี

วิธีการ นี้relativize()ช่วยให้คุณสร้าง "ความแตกต่างระหว่างเส้นทาง": เส้นทางหนึ่งสัมพันธ์กับอีกเส้นทางหนึ่ง

รหัส ค่า
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:
เส้นทางทั้งสองมี "รูท" ที่แตกต่างกัน (ดิสก์ที่แตกต่างกัน)

Path resolve(Path other)วิธี

วิธีการ นี้resolve()ตรงกันข้ามกับrelativize(): มันสร้างเส้นทางสัมบูรณ์ใหม่จากเส้นทางสัมบูรณ์และเส้นทางสัมพัทธ์

รหัส ค่า
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()วิธี

เมธอดส่งคืนFileวัตถุที่เลิกใช้แล้วซึ่งเก็บเส้นทางไฟล์เดียวกันกับPathวัตถุ

toURI()วิธี

เมธอดแปลงพาธเป็นURI มาตรฐาน และส่งกลับวัตถุที่มีพาธไปยังไฟล์:

เส้นทางไปยังไฟล์ URI ไปยังไฟล์
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt