1. Pathlớp học

Nếu bạn muốn viết một chương trình thực hiện điều gì đó với các tệp trên đĩa, điều đó khá dễ dàng. Java có rất nhiều lớp giúp bạn làm việc với cả tệp và nội dung của chúng.

Các phiên bản đầu tiên của Java đã sử dụng các lớp như FileFileInputStreamđể làm việc với các tệp. Tuy nhiên, Filelớp hiện không được dùng nữa và không được khuyến nghị sử dụng. Tất nhiên, bạn vẫn có thể gặp nó trong mã, tham số phương thức hoặc hàm tạo của lớp.

Ngay từ đầu, chúng ta sẽ bắt đầu học cách làm việc với các tệp bằng cách sử dụng Pathlớp. Pathlà lớp thay thế File. Nó an toàn hơn và hiệu quả hơn.

Pathlớp học

Về mặt kỹ thuật, Pathkhông phải là một lớp - nó là một giao diện. Điều này được thực hiện để cho phép viết một hậu duệ của Pathlớp cho mỗi hệ điều hành (và hệ thống tệp).

Windows có một tiêu chuẩn để ghi đường dẫn tệp và Linux có một tiêu chuẩn khác. Tất nhiên, có rất nhiều hệ điều hành khác trên thế giới và mỗi hệ điều hành đều có tiêu chuẩn riêng.

Đó là lý do tại sao Pathgiao diện được sử dụng ở mọi nơi trong các phương thức làm việc với tệp, mặc dù trong thực tế, công việc diễn ra thông qua các lớp con của nó: WindowsPath, UnixPath, ...

Tạo một Pathđối tượng

Để tạo một Pathđối tượng (mà thực sự sẽ là một đối tượng của WindowsPathlớp con cháu), bạn cần sử dụng một câu lệnh như sau:

Path name = Path.of(path);

Đâu namelà tên của một Pathbiến, và pathlà đường dẫn đến tệp (hoặc thư mục) bao gồm cả tên của tệp (hoặc thư mục). Và oflà một phương thức tĩnh của Pathlớp.

Phương of()thức được sử dụng để tạo WindowsPathcác đối tượng nếu chương trình đang chạy trên Windows. Nếu chương trình chạy trên Linux, thì UnixPathcác đối tượng sẽ được tạo. Bạn không thể tạo Pathđối tượng bằng mã như .new Path()

Ví dụ:

Mã số Ghi chú
Path file = Path.of("c:\\projects\\note.txt");
Đường dẫn đến tệp
Path directory = Path.of("c:\\projects\\");
Đường dẫn đến thư mục

Tệp (hoặc thư mục) không cần tồn tại để một Pathđối tượng hợp lệ tồn tại. Có thể bạn chỉ muốn tạo một tệp... Một Pathđối tượng giống như một sự cải tiến String: nó không gắn với một tệp cụ thể trên đĩa — nó chỉ lưu trữ một đường dẫn nhất định trên đĩa. Đó là nó.


2. Các phương thức của Pathkiểu

Giao Pathdiện có khá nhiều phương pháp thú vị. Những cái thú vị nhất được trình bày trong bảng dưới đây.

Phương pháp Sự miêu tả
Path getParent()
Trả về thư mục mẹ
Path getFileName()
Trả về tên tệp không có thư mục
Path getRoot()
Trả về thư mục gốc từ một đường dẫn
boolean isAbsolute()
Kiểm tra xem đường dẫn hiện tại có phải là tuyệt đối không
Path toAbsolutePath()
Chuyển đổi đường dẫn thành tuyệt đối
Path normalize()
Xóa ký tự đại diện trong tên thư mục.
Path resolve(Path other)
Xây dựng một đường dẫn tuyệt đối mới từ các đường dẫn tuyệt đối và tương đối.
Path relativize(Path other)
Lấy một đường dẫn tương đối từ hai đường dẫn tuyệt đối.
boolean startsWith(Path other)
Kiểm tra xem đường dẫn hiện tại có bắt đầu bằng một đường dẫn nhất định hay không
boolean endsWith(Path other)
Kiểm tra xem đường dẫn hiện tại có kết thúc bằng một đường dẫn nhất định hay không
int getNameCount()
Chia đường dẫn thành các phần bằng /dấu phân cách.
Trả về số phần.
Path getName(int index)
Chia đường dẫn thành các phần bằng /dấu phân cách.
Trả về một phần theo chỉ mục của nó.
Path subpath(int beginIndex, int endIndex)
Chia đường dẫn thành các phần bằng /dấu phân cách.
Trả về đường dẫn phụ tương ứng với khoảng đã cho.
File toFile()
Chuyển đổi một Pathđối tượng thành một Fileđối tượng không dùng nữa
URI toUri()
Chuyển đổi một Pathđối tượng thành một URIđối tượng

Dưới đây là một mô tả ngắn gọn về các phương pháp hiện có.


3. Chia đường dẫn thành nhiều phần

Phương getParent()thức trả về đường dẫn trỏ đến thư mục mẹ cho đường dẫn hiện tại. Bất kể đường dẫn này là thư mục hay tệp:

Mã số Giá trị
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

Phương getFileName()thức trả về một tên tệp (hoặc thư mục) duy nhất - bất cứ thứ gì xuất hiện sau dấu phân cách cuối cùng:

Mã số Giá trị
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

Phương getRoot()thức trả về đường dẫn đến thư mục gốc:

Mã số Giá trị
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. Đường dẫn tuyệt đối và tương đối

Có hai loại đường dẫn: tuyệt đối và tương đối. Một đường dẫn tuyệt đối bắt đầu từ thư mục gốc. Đối với Windows, đây có thể là c:\thư mục; cho Linux — /thư mục

Một đường dẫn tương đối có ý nghĩa liên quan đến một số thư mục. Đó là, nó giống như sự kết thúc của con đường, nhưng không có sự khởi đầu. Bạn có thể biến đường dẫn tương đối thành đường dẫn tuyệt đối và ngược lại

boolean isAbsolute()phương pháp

Phương thức kiểm tra xem đường dẫn hiện tại có phải là tuyệt đối hay không

Mã số Giá trị
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()phương pháp

Chuyển đổi đường dẫn thành tuyệt đối. Nếu cần, hãy thêm thư mục làm việc hiện tại vào đó:

Mã số Giá trị
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()phương pháp

Trong đường dẫn, thay vì tên thư mục, bạn có thể viết "..", có nghĩa là quay lại một thư mục . Bình thường hóa loại bỏ những điều này. Ví dụ:

Mã số Giá trị
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)phương pháp

Phương pháp này relativize()cho phép bạn xây dựng "sự khác biệt giữa các đường dẫn": một đường dẫn so với đường dẫn khác

Mã số Giá trị
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);
Ngoại lệ Đối số bất hợp pháp:
hai đường dẫn có một "gốc" khác nhau (các đĩa khác nhau)

Path resolve(Path other)phương pháp

Phương thức này resolve()ngược lại với relativize(): nó xây dựng một đường dẫn tuyệt đối mới từ một đường dẫn tuyệt đối và tương đối.

Mã số Giá trị
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()phương pháp

Phương thức trả về một Fileđối tượng không dùng nữa lưu trữ cùng một đường dẫn tệp với Pathđối tượng.

toURI()phương pháp

Phương thức này chuyển đổi đường dẫn thành một URI tiêu chuẩn và trả về một đối tượng chứa đường dẫn đến tệp:

Đường dẫn đến tệp URI vào tệp
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt