有没有比
更好的方法来获取文件基名和扩展名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);
答案 0 :(得分:147)
我知道其他人已提到String.split
,但这里有一个只会产生两个标记的变体(基础和扩展名):
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
例如:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
收率:
["test.cool.awesome", "txt"]
正则表达式告诉Java在任何句点之后进行拆分,其后跟任意数量的非句点,然后是输入的结尾。只有一个句点符合此定义(即最后期间)。
技术上正则说,这种技术称为zero-width positive lookahead。
BTW,如果你想分割路径并获得完整的文件名,包括但不限于点扩展名,使用带正斜杠的路径,
String[] tokens = dir.split(".+?/(?=[^/]+$)");
例如:
String dir = "/foo/bar/bam/boozled";
String[] tokens = dir.split(".+?/(?=[^/]+$)");
// [ "/foo/bar/bam/" "boozled" ]
答案 1 :(得分:69)
旧问题,但我通常使用此解决方案:
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" !)
答案 2 :(得分:10)
Java 7以后有一个名为Path的接口,以便携式方式处理这些事情:
Path p = FileSystems.getDefault().getPath(nam);
p.getParent();
如果您更喜欢较旧的API,请使用File类。
File f = new File(nam);
f.getParent();
存在没有可靠的功能。例如考虑这个文件名:
archive.tar.gz
的扩展名是什么? DOS用户更喜欢名称archive.tgz
。有时您会看到首先解压缩文件的愚蠢的 Windows应用程序(产生.tar
文件),然后您必须再次打开它以查看存档内容。
在这种情况下,更合理的文件扩展概念是.tar.gz
。还有.tar.bz2
,.tar.xz
,.tar.lz
和.tar.lzma
个文件“扩展名”正在使用中。但你会如何决定,是在最后一个点分割,还是倒数第二个点?
Java 7函数Files.probeContentType检测文件类型可能比信任文件扩展名更可靠。几乎所有Unix / Linux世界以及Webbrowser和Smartphone都已经这样做了。
答案 3 :(得分:9)
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()
来自http://www.xinotes.org/notes/note/774/:
Java具有内置函数来获取给定文件路径的basename和dirname,但函数名称并不那么明显。
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());
}
}
答案 4 :(得分:8)
来源: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());
}
}
答案 5 :(得分:1)
您的代码有什么问题?用一种简洁实用的方法包装好了。
更重要的是使用什么作为分隔符 - 第一个或最后一个点。第一个对于“setup-2.5.1.exe”这样的文件名是不好的,最后一个对于具有多个扩展名的文件名是不好的,比如“mybundle.tar.gz”。
答案 6 :(得分:-1)
您还可以使用java Regular Expression。 String.split()也在内部使用表达式。请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
答案 7 :(得分:-2)
也许你可以使用String#split
回答你的评论:
我不确定是否可以有多个。在文件名中,但无论如何,即使有更多的点你可以使用拆分。考虑例如的是:
String input = "boo.and.foo";
String[] result = input.split(".");
这将返回一个包含以下内容的数组:
{ "boo", "and", "foo" }
因此,您将知道数组中的最后一个索引是扩展名,而所有其他索引都是基础。