Как получить имя файла из строки, содержащей абсолютный путь к файлу?
String
переменная содержит имя файла, C:HelloAnotherFolderThe File Name.PDF
. Как я могу получить только имя файла The File Name.PDF
как строку?
Я планировал разбить строку, но это не оптимальное решение.
10 ответов:
просто использовать .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
заботится об этом вопросе для вас.
учитывая
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 если нет такого возникновения
используя
FilenameUtils
in Apache Commons IO:String name1 = FilenameUtils.getName("/ab/cd/xyz.txt"); String name2 = FilenameUtils.getName("c:\ab\cd\xyz.txt");
С 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];
метод без какой-либо зависимости и заботится о ..,. и дублировать сепараторы.
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 немного запутан, потому что он также возвращает имена каталогов. Она возвращает имя файла или последнего каталога в пути.
Considere случай, что Java является мультиплатформенным:
int lastPath = fileName.lastIndexOf(File.separator); if (lastPath!=-1){ fileName = fileName.substring(lastPath+1); }
извлечь имя файла с помощью 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; }