是否有比类似的方法更好的获取文件基名和扩展名的方法
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);
是否有比类似的方法更好的获取文件基名和扩展名的方法
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);
Answers:
我知道其他人提到过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" ]
老问题,但我通常使用以下解决方案:
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());
}
}
basename()
将是一个更好的名称,而不是filename()
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
什么是扩展名?DOS用户更喜欢该名称archive.tgz
。有时候你看到愚蠢的Windows应用程序首先解压缩文件(.tar
文件),然后必须再次将其打开以查看存档内容。
在这种情况下,文件扩展名的概念更为合理.tar.gz
。也有.tar.bz2
,.tar.xz
,.tar.lz
和.tar.lzma
在使用文件“扩展”。但是,您将如何决定是在最后一个点还是在倒数第二个点拆分?
Java 7函数Files.probeContentType可能比信任文件扩展名更可靠地检测文件类型。几乎所有的Unix / Linux世界以及您的Webbrowser和Smartphone都已经采用这种方式。
File
也不Path
让我分裂出去的延伸。
.tar.gz
与.tgz
UNIX上普遍使用的文件名相比)。请改用mime类型。
Files.probeContentType
而不是依靠文件名进行正确扩展的问题出在哪里?
您也可以使用Java正则表达式。String.split()还在内部使用表达式。请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
也许您可以使用String#split
要回答您的评论:
我不确定是否可以有多个。以文件名命名,但是无论如何,即使有更多点,您也可以使用分割。考虑例如:
String input = "boo.and.foo";
String[] result = input.split(".");
这将返回一个包含以下内容的数组:
{ "boo", "and", "foo" }
因此,您将知道数组中的最后一个索引是扩展名,所有其他索引都是基数。
.
字符串中最后一个的正则表达式
fileName.split("\\.(?=[^\\.]+$)")
FilenameUtils
。它具有getBaseName(..)
和getExtension(..)
方法。