String
змінна містить ім'я файлу, C:\Hello\AnotherFolder\The File Name.PDF
. Як я можу отримати лише ім'я файлу The File Name.PDF
у вигляді рядка?
Я планував розділити рядок, але це не оптимальне рішення.
String
змінна містить ім'я файлу, C:\Hello\AnotherFolder\The File Name.PDF
. Як я можу отримати лише ім'я файлу The File Name.PDF
у вигляді рядка?
Я планував розділити рядок, але це не оптимальне рішення.
Відповіді:
просто використовуйте File.getName ()
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
за допомогою String методів :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Альтернативне використання Path
(Java 7+):
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
Зауважте, що розділення рядка на \\
платформі залежить, оскільки роздільник файлів може відрізнятися. Path#getName
опікується цим питанням для вас.
Paths.get
звертається до файлової системи, тому не очікував, що продуктивність буде суттєво відрізнятися від підрядкової / indexOf.
Internet Explorer
нього, і він має шлях, "C:\\Hello\\AnotherFolder\\The File Name.PDF"
але ваш код працює на машині Unix / Linux, тоді p.getFileName()
він поверне весь шлях, а не тільки The File Name.PDF
.
toString()
так незручно.
Використання FilenameUtils
в AOche Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Зважаючи на String
те, що ви просите про це
C:\Hello\AnotherFolder\The File Name.PDF
нам потрібно витягти все після останнього роздільника, тобто. \
. Саме це нас цікавить.
Ви можете зробити
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Це дозволить отримати індекс останнього \
у вашому String
та витягти все, що потрапляє після нього fileName
.
Якщо у вас String
інший роздільник, відрегулюйте його, lastIndexOf
щоб використовувати цей роздільник. (Існує навіть перевантаження, яка приймає ціле String
як роздільник.)
Я пропустив це у наведеному вище прикладі, але якщо ви не впевнені, звідки String
походить або що він може містити, ви хочете перевірити, що lastIndexOf
повертає негативне значення, оскільки Javadoc заявляє, що повернеться
-1 якщо такого не відбувається
ви можете використовувати path = C: \ Hello \ AnotherFolder \ TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
/
на unix і \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like
File` або Paths
.
File.separator
залежить також платформа? Або це спрацювало б ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
File.separator
не завжди працюватиме тут, оскільки в Windows ім'я файлу можна розділити "/"
або "\\"
.
Інші відповіді не спрацювали для мого конкретного сценарію, де я читаю шляхи, що виникли від ОС, відмінної від моєї поточної. Для розробки я зберігаю вкладення електронної пошти, збережені з платформи Windows на сервері Linux. Ім'я файлу, повернене з API JavaMail, виглядає як "C: \ temp \ hello.xls"
Рішення, в якому я закінчився:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Розглянемо випадок, що Java є мультиплатформою:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Метод без будь-якої залежності і піклується про .. , . і дублюючі роздільники.
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 "";
}
Тестовий випадок:
@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"));
}
Можливо, getFileName трохи заплутаний, тому що він також повертає імена каталогів. Він повертає ім'я файлу або останнього каталогу в шляху.
витягнути ім'я файлу за допомогою 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;
}
метод getFileName () java.nio.file.Path використовується для повернення імені файлу або каталогу, вказаного цим об'єктом шляху.
Шлях getFileName ()
Довідково:
https://www.geeksforgeeks.org/path-getfilename-method-in-java-with-examples/
Ви можете використовувати об'єкт FileInfo, щоб отримати всю інформацію про свій файл.
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);