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的百科全书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();
您可以使用路径= C:\你好\ AnotherFolder \ TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
其他答案不太对我的具体情况,在那里我读源自操作系统的不同,以我目前的一个路径工作。 为了详细说明我现在的储蓄从Windows平台上的Linux服务器上保存的电子邮件附件。 于JavaMail API返回的文件名是一样的东西“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正则表达式*文件名。
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;
}