我如何从包含文件的绝对路径的字符串的文件名?(How do I get the file name

2019-07-18 17:03发布

String变量包含一个文件名, C:\Hello\AnotherFolder\The File Name.PDF 。 如何只得到文件名The File Name.PDF作为一个字符串?

我打算分割字符串,但这并不是最佳的解决方案。

Answer 1:

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


Answer 2:

使用替代Path (Java 7+):

Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();

需要注意的是分裂的字符串\\依赖于平台的文件分隔符可能会有所不同。 Path#getName照顾这个问题的为您服务。



Answer 3:

使用FilenameUtils在Apache的百科全书IO :

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");


Answer 4:

考虑到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,如果不存在这样的发生



Answer 5:

由于1.7

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();


Answer 6:

您可以使用路径= C:\你好\ AnotherFolder \ TheFileName.PDF

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());


Answer 7:

其他答案不太对我的具体情况,在那里我读源自操作系统的不同,以我目前的一个路径工作。 为了详细说明我现在的储蓄从Windows平台上的Linux服务器上保存的电子邮件附件。 于JavaMail API返回的文件名是一样的东西“C:\ TEMP \ hello.xls”

我结束了解决方案:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];


Answer 8:

没有任何依赖性的方法,并采取..,的照顾 和重复分隔符。

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



Answer 9:

Considere,Java是多的情况下:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}


Answer 10:

提取使用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;
    }


文章来源: How do I get the file name from a String containing the Absolute file path?