如何从包含绝对文件path的string获取文件名?

Stringvariables包含一个文件名, C:\Hello\AnotherFolder\The File Name.PDF 。 我怎样才能得到文件名称的文件名称The File Name.PDF作为一个string?

我打算分割string,但这不是最佳解决scheme。

只要使用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(); 

请注意,拆分\\上的string与平台相关,因为文件分隔符可能会有所不同。 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从哪里来,或者它可能包含什么,你将需要validationlastIndexOf返回一个非负值,因为Javadoc声明它会返回

-1如果没有这种情况发生

在Apache Commons IO中使用FilenameUtils

 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()); 

其他的答案并不适用于我的特定场景,在这里我正在读取源自与当前操作系统不同的操作系统的path。 详细说明我正在保存从Linux平台上的Windows服务器上保存的电子邮件附件。 从JavaMail API返回的文件名就像是“C:\ temp \ hello.xls”

我结束了解决scheme:

 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 ""; } 

testing用例:

 @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有点混乱,因为它也返回目录名称。 它返回path中的文件或最后一个目录的名称。

使用java正则expression式*提取文件名。

 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; } 
Interesting Posts