2012-04-26 22 views
14

Tôi có đường dẫn tệp hoàn chỉnh và tôi muốn lấy tên tệp.Tách tên tệp bằng biểu tượng dấu phân cách tệp hệ thống

Tôi đang sử dụng các hướng dẫn sau đây:

String[] splittedFileName = fileName.split(System.getProperty("file.separator")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 

Nhưng trên Windows nó mang lại:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 
\ 
^ 

Tôi có thể tránh ngoại lệ này? Có cách nào tốt hơn để làm điều này?

Trả lời

34

Sự cố là \ phải được thoát để sử dụng nó làm dấu gạch chéo ngược trong cụm từ thông dụng. Bạn có thể nên sử dụng một splitting API which doesn't use regular expressions, hoặc sử dụng Pattern.quote đầu tiên:

// Alternative: use Pattern.quote(File.separator) 
String pattern = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(pattern); 

Hoặc thậm chí tốt hơn, sử dụng File API cho việc này:

File file = new File(fileName); 
String simpleFileName = file.getName(); 
3

Khi bạn viết một tên tập tin, bạn nên sử dụng System.getProperty("file.separator").

Khi bạn đọc tên tệp, bạn có thể có dấu gạch chéo hoặc dấu gạch chéo ngược làm dấu tách tệp.

Bạn có thể muốn thử như sau:

fileName = fileName.replace("\\", "/"); 
String[] splittedFileName = fileName.split("/")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
+0

Cảm ơn @Gilbert Le Blanc, đoạn mã tốt! đơn giản và hoạt động tuyệt vời! –

0

Trước hết, đối với vấn đề cụ thể này tôi khuyên bạn nên sử dụng các lớp java.util.File thay vì một regex.

Điều đó đang được nói, gốc của sự cố bạn đang gặp phải là ký tự dấu chéo ngược '\' biểu thị chuỗi thoát trong biểu thức chính quy Java. Điều gì đang xảy ra là trình phân tích cú pháp regex đang nhìn thấy dấu gạch chéo ngược và mong đợi có một ký tự khác sau khi nó sẽ hoàn thành chuỗi thoát. Cách dễ nhất để giải quyết vấn đề này là sử dụng phương thức java.util.regex.Pattern.quote() để thoát khỏi bất kỳ ký tự đặc biệt nào trong chuỗi mà bạn cung cấp.

Với điều này thay đổi mã của bạn trở thành:

String splitRegex = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(splitRegex); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
2

Một cách khác đơn giản hơn có thể làm

File f = new File(path); 
String fileName = f.getName(); 

Tôi tin rằng điều này sẽ làm việc cung cấp các đường dẫn tương thích với nền tảng này, tức là không chắc chắn nếu đường dẫn "c: \ file.txt" sẽ hoạt động trên Linux hay không.

Các vấn đề liên quan