有没有比这种方式更好的方法来获取文件的基本名称和扩展名:
File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
我知道其他人已经提到了String.split
,但这里有一个变体,仅产生两个标记(基础和扩展名):
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
例如:"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
产生:
["test.cool.awesome", "txt"]
正则表达式告诉Java在任何后面跟着任意数量的非句点字符,以及输入结尾的所有句点上进行拆分。只有一个符合此定义的句点(即最后一个句点)。
String[] tokens = dir.split(".+?/(?=[^/]+$)");
例如: String dir = "/foo/bar/bam/boozled";
String[] tokens = dir.split(".+?/(?=[^/]+$)");
// [ "/foo/bar/bam/" "boozled" ]
archive.tar.gz
的正确扩展名应为.tar.gz
。 - Has QUIT--Anony-Mousse这是一个老问题,但我通常使用这个解决方案:
import org.apache.commons.io.FilenameUtils;
String fileName = "/abc/defg/file.txt";
String basename = FilenameUtils.getBaseName(fileName);
String extension = FilenameUtils.getExtension(fileName);
System.out.println(basename); // file
System.out.println(extension); // txt (NOT ".txt" !)
来源:http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm
这是一个实用类:
class Filename {
private String fullPath;
private char pathSeparator, extensionSeparator;
public Filename(String str, char sep, char ext) {
fullPath = str;
pathSeparator = sep;
extensionSeparator = ext;
}
public String extension() {
int dot = fullPath.lastIndexOf(extensionSeparator);
return fullPath.substring(dot + 1);
}
public String filename() { // gets filename without extension
int dot = fullPath.lastIndexOf(extensionSeparator);
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(sep + 1, dot);
}
public String path() {
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(0, sep);
}
}
使用方法:
public class FilenameDemo {
public static void main(String[] args) {
final String FPATH = "/home/mem/index.html";
Filename myHomePage = new Filename(FPATH, '/', '.');
System.out.println("Extension = " + myHomePage.extension());
System.out.println("Filename = " + myHomePage.filename());
System.out.println("Path = " + myHomePage.path());
}
}
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()
来自http://www.xinotes.org/notes/note/774/ :
Java内置了获取给定文件路径的基名和目录名的函数,但是函数名称不够明显。
import java.io.File;
public class JavaFileDirNameBaseName {
public static void main(String[] args) {
File theFile = new File("../foo/bar/baz.txt");
System.out.println("Dirname: " + theFile.getParent());
System.out.println("Basename: " + theFile.getName());
}
}
而且不存在可靠的函数。例如,考虑以下文件名:
archive.tar.gz
File
还是Path
都不能让我分离出扩展名。 - Andreas Abel.tar.gz
与.tgz
非常常见)。使用MIME类型代替。 - Has QUIT--Anony-MousseFiles.probeContentType
而不是依赖于文件名具有正确扩展名的情况下,问题出在哪里? - Has QUIT--Anony-Mousse您还可以使用Java正则表达式。String.split()也在内部使用该表达式。请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html。
也许你可以使用String#split。
回答你的评论:
我不确定文件名中是否可以有多个“.”,但无论如何,即使有更多的点,你也可以使用split。例如考虑以下情况:
String input = "boo.and.foo";
String[] result = input.split(".");
{ "boo", "and", "foo" }
所以你会知道数组中的最后一个索引是扩展名,而其他所有索引都是基础。
.
的正则表达式。 - Jason SfileName.split("\\.(?=[^\\.]+$)")
。 - Adam Paynter
FilenameUtils
。它具有getBaseName(..)
和getExtension(..)
方法。 - Bozho