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
заботится об этой проблеме для вас.
Использование FilenameUtils
в Apache 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, если таких случаев нет
Так как 1.7
Path p = Paths.get("c:\\temp\\1.txt");
String fileName = p.getFileName().toString();
String directory = p.getParent().toString();
вы можете использовать path = C:\Hello\AnotherFolder\TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
Другие ответы не совсем сработали для моего конкретного сценария, где я читаю пути, которые возникли из ОС, отличной от моей текущей. Чтобы разработать, я сохраняю вложения электронной почты, сохраненные с платформы 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/