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");