如何从包含绝对文件path的string获取文件名?
String
variables包含一个文件名, 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; }