Cách kiểm tra phần mở rộng của Java 7 Path


83

Tôi muốn kiểm tra xem một Đường dẫn (được giới thiệu trong Java 7) có kết thúc bằng một phần mở rộng nhất định hay không. Tôi đã thử endsWith()phương pháp như vậy:

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}

Tuy nhiên, điều này dường như không hoạt động vì path.endsWith(".java")trả về false. Có vẻ như endsWith()phương thức chỉ trả về true nếu có một kết quả khớp hoàn toàn cho mọi thứ sau dấu phân tách thư mục cuối cùng (ví dụ bar.java), điều này không thực tế đối với tôi.

Vậy làm cách nào để kiểm tra phần mở rộng tệp của một Đường dẫn?



1
@assylias, câu hỏi đó là để tìm tiện ích mở rộng từ a String, không phải a Path(mặc dù nó sẽ hoạt động với Path.toString(), nhưng tôi đã hy vọng một cách không yêu cầu điều đó).
Thunderforge

Khái niệm về phần mở rộng tệp phụ thuộc vào hệ điều hành vì vậy tôi không nghĩ rằng có hỗ trợ cho nó trong Tệp hoặc Đường dẫn.
assylias 12/1213

@assylias: Chà, tệ quá. Khái niệm về phần mở rộng tệp được định nghĩa rõ ràng và được sử dụng nhiều lần trong Windows / Linux / MacOs / Android. Mặc dù chúng có thể ít quan trọng hơn trong Linux so với Windows, chúng vẫn được sử dụng rất nhiều trên các ứng dụng máy tính để bàn và máy chủ.
Eric Duminil

Câu trả lời:


82

Java NIO's PathMatcher cung cấp FileSystem.getPathMatcher (String Cú phápAndPattern) :

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}

Xem hướng dẫn Tìm tệp để biết chi tiết.


14
Tôi nghĩ rằng điều này bị thiếu một dấu hoa thị, những điều sau đây phù hợp với tôi:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
Josh.

22
Và nếu bạn đang xem qua các thư mục khác nhau, bạn cần sử dụng "perf: **. Java"
LaGrandMere

1
Đối với tôi, bình luận của LaGrandMere đã làm được điều đó. Nếu @Dave Jarvis có thể hợp nhất lời khuyên của anh ấy thành câu trả lời được bầu chọn, tôi đoán điều đó sẽ giúp ích cho những người mới bắt đầu trong NIO-API. Dưới Windoze: Nếu tôi muốn sử dụng glob:*.java, thì filenamekhông nên chứa bất kỳ đường dẫn cha nào. Nếu tôi sử dụng đường dẫn rel / abs glob:c:/users/muchwow/*.java, nó hoạt động (lưu ý rằng \\\\ phải được sử dụng với dấu gạch chéo ngược). Mẫu glob:**.javachỉ tìm kiếm mọi thứ có * .java trong đó, bất kể đường dẫn mẹ là gì.
JackLeEmmerdeur,

67

Các Pathlớp không có một khái niệm "mở rộng", có lẽ vì hệ thống tập tin tự nó không có nó. Đó là lý do tại sao bạn cần kiểm tra sự Stringthể hiện của nó và xem nó có kết thúc bằng bốn năm ký tự hay không .java. Lưu ý rằng bạn cần một so sánh khác so với đơn giản endsWithnếu bạn muốn bao gồm trường hợp hỗn hợp, chẳng hạn như ".JAVA"".Java":

path.toString().toLowerCase().endsWith(".java");

15

Giải pháp đơn giản:

if( path.toString().endsWith(".java") ) //Do something

Bạn phải cẩn thận khi sử dụng phương thức Path.endsWith. Như bạn đã nêu, phương thức sẽ chỉ trả về true nếu nó khớp với một phần tử con của đối tượng Path của bạn. Ví dụ:

Path p = Paths.get("C:/Users/Public/Mycode/HelloWorld.java");
System.out.println(p.endsWith(".java")); // false
System.out.println(p.endsWith("HelloWorld.java")); // true

3

Không có cách nào để thực hiện điều này trực tiếp trên chính đối tượng Path.

Có hai tùy chọn tôi có thể thấy:

  1. Chuyển đổi đường dẫn thành tệp và kết thúc cuộc gọi Với trên chuỗi được trả về bởi File.getName ()
  2. Gọi tới Chuỗi trên Đường dẫn và cuộc gọi kết thúc Với trên Chuỗi đó.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.