如何从包含绝对文件路径的String中获取文件名?

sha*_*Hwk 221 java filenames file filepath

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

我打算拆分字符串,但这不是最佳解决方案.

ass*_*ias 266

替代使用Path(Java 7+):

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

请注意,拆分字符串\\是依赖于平台的,因为文件分隔符可能会有所不同.Path#getName为你解决这个问题.

  • 是的,Path应对平台相关的斜杠/反斜杠问题,但前提是文件路径来自同一台机器(或平台).考虑一下:你从`Internet Explorer`上传文件,它有路径`"C:\\ Hello \\ AnotherFolder \\ The File Name.PDF"`但是你的代码在Unix/Linux机器上运行,然后是`p. getFileName()`将返回整个路径,而不仅仅是`File Name.PDF`. (12认同)
  • 怎么在Android上不存在?奇怪的. (7认同)
  • 调用 `toString()` 太尴尬了。 (4认同)

Per*_*ror 257

只需使用File.getName()

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
Run Code Online (Sandbox Code Playgroud)

使用String方法:

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


Bin*_*abu 52

使用FilenameUtils的Apache下议院IO:

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Run Code Online (Sandbox Code Playgroud)

  • 我认为这可能是最好的,因为有时您可能必须处理来自其他平台的文件路径 (3认同)
  • 这是最好的解决方案。它是平台无关的。 (2认同)

Sot*_*lis 33

考虑到String你问的是

C:\Hello\AnotherFolder\The File Name.PDF
Run Code Online (Sandbox Code Playgroud)

我们需要在最后一个分隔符后提取所有内容,即.\.这就是我们感兴趣的.

你可以做

String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Run Code Online (Sandbox Code Playgroud)

这将检索\您的最后一个索引String并提取其后的所有内容fileName.

如果您String使用不同的分隔符,请调整lastIndexOf以使用该分隔符.(甚至有一个重载接受整个String作为分隔符.)

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

-1如果没有这种情况


max*_*x3d 22

从1.7开始

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


Rak*_*esh 11

你可以使用path = C:\ Hello\AnotherFolder\TheFileName.PDF

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
Run Code Online (Sandbox Code Playgroud)

  • `File.separator`也是平台依赖的吗?或者这会工作......`String strPath = path.substring(path.lastIndexOf(File.separator)+ 1,path.length());` (3认同)
  • 您不应该使用其中任何一个,因为它依赖于平台。unix 上的 `/` 和 windows 上的 `\\`(这里的 MARKDOWN 解析器中有一个错误)。你不可能知道。使用另一种解决方案,如“文件”或“路径”。 (2认同)
  • `File.separator` 在这里并不总是有效,因为在 Windows 中,文件名可以用 `"/"` 或 `"\\"` 分隔。 (2认同)

jav*_*bic 9

其他答案对我的具体情况并不适用,我正在阅读源自与当前操作系统不同的操作系统的路径.详细说明我正在保存从Linux服务器上的Windows平台保存的电子邮件附件.从JavaMail API返回的文件名类似于'C:\ temp\hello.xls'

我最终得到的解决方案:

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