Stringbiến chứa tên tệp , C:\Hello\AnotherFolder\The File Name.PDF. Làm cách nào để tôi chỉ lấy tên tệp The File Name.PDFdưới dạng Chuỗi?
Tôi dự định tách chuỗi, nhưng đó không phải là giải pháp tối ưu.
Stringbiến chứa tên tệp , C:\Hello\AnotherFolder\The File Name.PDF. Làm cách nào để tôi chỉ lấy tên tệp The File Name.PDFdưới dạng Chuỗi?
Tôi dự định tách chuỗi, nhưng đó không phải là giải pháp tối ưu.
Câu trả lời:
chỉ cần sử dụng File.getName ()
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
sử dụng các phương thức String :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Sử dụng thay thế Path(Java 7+):
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
Lưu ý rằng việc tách chuỗi trên \\phụ thuộc vào nền tảng vì trình phân tách tệp có thể khác nhau. Path#getNamechăm sóc vấn đề đó cho bạn
Paths.gettruy cập hệ thống tệp nên sẽ không mong đợi hiệu suất sẽ khác về mặt vật chất so với chuỗi con / indexOf.
Internet Explorervà nó có đường dẫn "C:\\Hello\\AnotherFolder\\The File Name.PDF"nhưng mã của bạn đang hoạt động trên máy Unix / Linux, sau đó p.getFileName()sẽ trả về toàn bộ đường dẫn, không chỉ The File Name.PDF.
toString()thì thật khó xử.
Sử dụng FilenameUtilstrong Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Xem xét Stringbạn đang hỏi về
C:\Hello\AnotherFolder\The File Name.PDF
chúng ta cần trích xuất mọi thứ sau dấu phân cách cuối cùng, nghĩa là. \. Đó là những gì chúng tôi quan tâm.
Bạn có thể làm
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Điều này sẽ lấy chỉ mục cuối cùng \trong của bạn Stringvà trích xuất mọi thứ xuất hiện sau nó fileName.
Nếu bạn có một Stringdấu phân cách khác, hãy điều chỉnh lastIndexOfđể sử dụng dấu phân cách đó. (Thậm chí có một tình trạng quá tải chấp nhận toàn bộ Stringnhư một dải phân cách.)
Tôi đã bỏ qua nó trong ví dụ trên, nhưng nếu bạn không chắc nó Stringđến từ đâu hoặc nó có thể chứa gì, bạn sẽ muốn xác thực rằng lastIndexOfgiá trị đó không trả về giá trị vì Javadoc nói rằng nó sẽ trả về
-1 nếu không có sự cố như vậy
bạn có thể sử dụng path = C: \ Hello \ AnotherFolder \ TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
/trên unix và \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` hoặc Paths.
File.separatornền tảng cũng phụ thuộc? Hoặc điều này sẽ làm việc ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
File.separatorsẽ không luôn hoạt động ở đây vì trong Windows, tên tệp có thể được phân tách bằng "/"hoặc "\\".
Các câu trả lời khác không hoàn toàn phù hợp với kịch bản cụ thể của tôi, nơi tôi đang đọc các đường dẫn có nguồn gốc từ một hệ điều hành khác với hệ điều hành hiện tại của tôi. Để giải thích, tôi đang lưu các tệp đính kèm email được lưu từ nền tảng Windows trên máy chủ Linux. Tên tệp được trả về từ API JavaMail giống như 'C: \ temp \ hello.xls'
Giải pháp tôi đã kết thúc với:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Xem xét trường hợp Java là Đa nền tảng:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Một phương pháp không có bất kỳ sự phụ thuộc và chăm sóc .. , . và phân tách trùng lặp.
public static String getFileName(String filePath) {
if( filePath==null || filePath.length()==0 )
return "";
filePath = filePath.replaceAll("[/\\\\]+", "/");
int len = filePath.length(),
upCount = 0;
while( len>0 ) {
//remove trailing separator
if( filePath.charAt(len-1)=='/' ) {
len--;
if( len==0 )
return "";
}
int lastInd = filePath.lastIndexOf('/', len-1);
String fileName = filePath.substring(lastInd+1, len);
if( fileName.equals(".") ) {
len--;
}
else if( fileName.equals("..") ) {
len -= 2;
upCount++;
}
else {
if( upCount==0 )
return fileName;
upCount--;
len -= fileName.length();
}
}
return "";
}
Trường hợp thử nghiệm:
@Test
public void testGetFileName() {
assertEquals("", getFileName("/"));
assertEquals("", getFileName("////"));
assertEquals("", getFileName("//C//.//../"));
assertEquals("", getFileName("C//.//../"));
assertEquals("C", getFileName("C"));
assertEquals("C", getFileName("/C"));
assertEquals("C", getFileName("/C/"));
assertEquals("C", getFileName("//C//"));
assertEquals("C", getFileName("/A/B/C/"));
assertEquals("C", getFileName("/A/B/C"));
assertEquals("C", getFileName("/C/./B/../"));
assertEquals("C", getFileName("//C//./B//..///"));
assertEquals("user", getFileName("/user/java/.."));
assertEquals("C:", getFileName("C:"));
assertEquals("C:", getFileName("/C:"));
assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
assertEquals("C.ext", getFileName("/A/B/C.ext"));
assertEquals("C.ext", getFileName("C.ext"));
}
Có lẽ getFileName hơi khó hiểu, vì nó cũng trả về tên thư mục. Nó trả về tên của tệp hoặc thư mục cuối cùng trong một đường dẫn.
trích xuất tên tệp bằng java regex *.
public String extractFileName(String fullPathFile){
try {
Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
Matcher regexMatcher = regex.matcher(fullPathFile);
if (regexMatcher.find()){
return regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
}
return fullPathFile;
}
Phương thức getFileName () của java.nio.file.Path được sử dụng để trả về tên của tệp hoặc thư mục được chỉ ra bởi đối tượng đường dẫn này.
Đường dẫn getFileName ()
Để tham khảo:
https://www.geekforgeek.org/path-getfilename-method-in-java-with-examples/
Bạn có thể sử dụng đối tượng FileInfo để lấy tất cả thông tin của tệp.
FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
MessageBox.Show(f.Name);
MessageBox.Show(f.FullName);
MessageBox.Show(f.Extension );
MessageBox.Show(f.DirectoryName);