Java 如何从包含绝对文件路径的字符串中获取文件名?

Java 如何从包含绝对文件路径的字符串中获取文件名?,java,file,filenames,filepath,Java,File,Filenames,Filepath,String变量包含一个文件名,C:\Hello\AnotherFolder\The file name.PDF。如何仅将文件名文件名.PDF作为字符串获取 我计划拆分字符串,但这不是最佳解决方案。只需使用 File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF"); System.out.println(f.getName()); 使用字符串方法: File f = new File("C:\\Hello\\Anoth

String
变量包含一个文件名,
C:\Hello\AnotherFolder\The file name.PDF
。如何仅将文件名
文件名.PDF
作为字符串获取

我计划拆分字符串,但这不是最佳解决方案。

只需使用

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
使用字符串方法

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));

考虑到您询问的
字符串

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);
这将检索
字符串中最后一个
\
的索引,并将其后的所有内容提取到
文件名中

如果有带不同分隔符的
字符串
,请调整
lastIndexOf
以使用该分隔符。(甚至还有一个接受整个
字符串作为分隔符的。)

我在上面的示例中省略了它,但是如果您不确定
字符串
来自何处或者它可能包含什么,您将需要验证
lastIndexOf
是否返回非负值,因为它将返回

-1如果没有此类事件发生

使用Java 7+的替代方案:


请注意,在
\\
上拆分字符串取决于平台,因为文件分隔符可能会有所不同
Path#getName
为您解决该问题。

您可以使用Path=C:\Hello\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有点混乱,因为它还返回目录名。它返回路径中文件或最后一个目录的名称

在以下位置使用
FilenameUtils

从1.7开始

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

使用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;
    }
publicstringextractFileName(stringfullpathfile){
试一试{
Pattern regex=Pattern.compile(“([^\\\\/:*?\”\r\n]+$)”;
Matcher regexMatcher=regex.Matcher(fullPathFile);
if(regexMatcher.find()){
返回regexMatcher.group(1);
}
}捕获(模式语法异常){
info(“extractFileName::pattern problem”,ex);
}
返回完整路径文件;
}

考虑到Java是多平台的情况:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}
java.nio.file.Path的getFileName()方法,用于返回此路径对象指向的文件或目录的名称

路径getFileName()

供参考:


您可以使用FileInfo对象获取文件的所有信息

    FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
    MessageBox.Show(f.Name);
    MessageBox.Show(f.FullName);
    MessageBox.Show(f.Extension );
    MessageBox.Show(f.DirectoryName);

这个答案在c#中适用于我:


有人对这个问题中的各种方法进行了性能比较吗?@crush我不认为
Path.get
访问文件系统,所以不会期望性能与子字符串/indexOf有实质性的不同。为什么Android上不存在它?奇怪。是的,Path解决了依赖于平台的斜杠/ba问题CKSLASH,但只有当文件路径来自同一台机器(或平台)时,请考虑:您从<代码> Internet Explorer <代码>上传文件,它有路径<代码>“C:\HELL\\AdHealth\\文件名.pdf”< /COD> >但是您的代码在UNIX/Linux机器上工作,然后<代码> P.GETFILMENAMEA()
将返回整个路径,而不仅仅是
文件名.PDF
。调用
toString()
太麻烦了。您应该使用\\而不是\您不应该使用其中任何一个,因为它依赖于平台。
/
在unix和
\`(这里的标记解析器中有一个错误)在windows上。您不知道。使用另一种解决方案,如
File`或
路径
File.separator
是否也依赖于平台?或者这是否有效…
String strPath=path.substring(path.lastIndexOf(File.separator)+1,path.length();
File.separator和File.separator都是“/在UNIX/Linux/macOS版本的JDK上,以及在Windows版本上的“\”。
File.separator
在这里并不总是有效,因为在Windows中,文件名可以用
“/”或
“\\”
分隔。关于,它已经被修复。我认为这可能是最好的,因为有时您可能需要处理来自其他平台的文件路径,这是最好的,因为:代码中易于阅读、最健壮、对象较少的cluder+1Btw任何人都可以使用
FilenameUtils.getBaseName(filePath)
小心使用带有“/”而不是“\”@golimar的路径名,这应该同时删除Windows和Unix路径(不使用
文件
类):
YourStringPath.replaceAll(“^.*[\/\\\\\]”,”)
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}
    FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
    MessageBox.Show(f.Name);
    MessageBox.Show(f.FullName);
    MessageBox.Show(f.Extension );
    MessageBox.Show(f.DirectoryName);
using System.IO;
string fileName = Path.GetFileName("C:\Hello\AnotherFolder\The File Name.PDF");