Java NIO - Đường dẫn

Như tên cho thấy Đường dẫn là vị trí cụ thể của một thực thể như tệp hoặc thư mục trong hệ thống tệp để người ta có thể tìm kiếm và truy cập nó tại vị trí cụ thể đó.

Về mặt kỹ thuật của Java, Path là một giao diện được giới thiệu trong gói tệp Java NIO trong phiên bản Java 7 và là đại diện của vị trí trong hệ thống tệp cụ thể. Vì giao diện đường dẫn nằm trong gói Java NIO nên nó có tên đủ điều kiện là java .nio.file.Path.

Nói chung, đường dẫn của một thực thể có thể có hai loại một là đường dẫn tuyệt đối và một là đường dẫn tương đối. Như tên của cả hai đường dẫn cho thấy rằng đường dẫn tuyệt đối là địa chỉ vị trí từ gốc đến thực thể nơi nó định vị trong khi đường dẫn tương đối là địa chỉ vị trí liên quan đến một số đường dẫn khác. Đường dẫn sử dụng dấu phân cách trong định nghĩa của nó là "\" cho Windows và "/" cho hệ điều hành unix.

Để có được thể hiện của Path, chúng ta có thể sử dụng phương thức tĩnh của lớp java.nio.file.Paths get()Phương thức này chuyển đổi một chuỗi đường dẫn hoặc một chuỗi các chuỗi khi được nối với nhau tạo thành một chuỗi đường dẫn, thành một cá thể Đường dẫn. Phương thức này cũng ném ra thời gian chạy không hợp lệ nếu các đối số được truyền chứa các ký tự không hợp lệ.

Như đã đề cập ở trên, đường dẫn tuyệt đối được truy xuất bằng cách chuyển phần tử gốc và danh sách thư mục đầy đủ cần thiết để định vị tệp. Trong khi đường dẫn tương đối có thể được truy xuất bằng cách kết hợp đường dẫn cơ sở với đường dẫn tương đối. Việc truy xuất cả hai đường dẫn sẽ được minh họa trong ví dụ sau

Thí dụ

package com.java.nio;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.file.FileSystem;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
   public static void main(String[] args) throws IOException {
      Path relative = Paths.get("file2.txt");
      System.out.println("Relative path: " + relative);
      Path absolute = relative.toAbsolutePath();
      System.out.println("Absolute path: " + absolute);
   }
}

Cho đến nay chúng ta biết rằng giao diện đường dẫn là gì tại sao chúng ta cần nó và làm thế nào chúng ta có thể truy cập nó. Bây giờ chúng ta sẽ biết các phương thức quan trọng mà giao diện đường dẫn cung cấp cho chúng ta.

Các phương pháp quan trọng của Giao diện Đường dẫn

  • getFileName() - Trả về hệ thống tệp đã tạo đối tượng này.

  • getName() - Trả về một phần tử tên của đường dẫn này như một đối tượng Đường dẫn.

  • getNameCount() - Trả về số phần tử tên trong đường dẫn.

  • subpath() - Trả về một Đường dẫn tương đối là một dãy con của các phần tử tên của đường dẫn này.

  • getParent() - Trả về đường dẫn cha hoặc null nếu đường dẫn này không có cha.

  • getRoot() - Trả về thành phần gốc của đường dẫn này dưới dạng đối tượng Đường dẫn hoặc null nếu đường dẫn này không có thành phần gốc.

  • toAbsolutePath() - Trả về một đối tượng Path đại diện cho đường dẫn tuyệt đối của đường dẫn này.

  • toRealPath() - Trả về đường dẫn thực của một tệp hiện có.

  • toFile() - Trả về một đối tượng File đại diện cho đường dẫn này.

  • normalize() - Trả về một đường dẫn là đường dẫn này với các phần tử tên dư thừa bị loại bỏ.

  • compareTo(Path other) - So sánh hai đường dẫn trừu tượng về mặt từ vựng. Phương thức này trả về 0 nếu đối số bằng với đường dẫn này, giá trị nhỏ hơn 0 nếu đường dẫn này nhỏ hơn về mặt từ vựng hoặc giá trị lớn hơn 0 nếu đường dẫn này về mặt từ vựng lớn hơn đối số .

  • endsWith(Path other) - Kiểm tra xem đường dẫn này có kết thúc bằng đường dẫn đã cho hay không. Nếu đường dẫn đã cho có N phần tử và không có thành phần gốc và đường dẫn này có N phần tử trở lên, thì đường dẫn này kết thúc bằng đường dẫn đã cho nếu N phần tử cuối cùng của mỗi đường dẫn, bắt đầu từ phần tử xa gốc nhất, bằng nhau.

  • endsWith(String other) - Kiểm tra xem đường dẫn này có kết thúc bằng Đường dẫn hay không, được xây dựng bằng cách chuyển đổi chuỗi đường dẫn đã cho, theo đúng cách được chỉ định bởi phương thức endWith (Đường dẫn).

Thí dụ

Ví dụ sau minh họa các phương thức khác nhau của giao diện Path được đề cập ở trên:

package com.java.nio;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.file.FileSystem;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
   public static void main(String[] args) throws IOException {
      Path path = Paths.get("D:/workspace/ContentW/Saurav_CV.docx");
      FileSystem fs =  path.getFileSystem();
      System.out.println(fs.toString());
      System.out.println(path.isAbsolute());
      System.out.println(path.getFileName());
      System.out.println(path.toAbsolutePath().toString());
      System.out.println(path.getRoot());
      System.out.println(path.getParent());
      System.out.println(path.getNameCount());
      System.out.println(path.getName(0));
      System.out.println(path.subpath(0, 2));
      System.out.println(path.toString());
      System.out.println(path.getNameCount());
      Path realPath = path.toRealPath(LinkOption.NOFOLLOW_LINKS);
      System.out.println(realPath.toString());
      String originalPath = "d:\\data\\projects\\a-project\\..\\another-project";
      Path path1 = Paths.get(originalPath);
      Path path2 = path1.normalize();
      System.out.println("path2 = " + path2);
   }
}