String
biế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.PDF
dướ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.
String
biế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.PDF
dướ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#getName
chăm sóc vấn đề đó cho bạn
Paths.get
truy 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 Explorer
và 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 FilenameUtils
trong Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Xem xét String
bạ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 String
và trích xuất mọi thứ xuất hiện sau nó fileName
.
Nếu bạn có một String
dấ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ộ String
như 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 lastIndexOf
giá 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.separator
nề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.separator
sẽ 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);