Java:将文件名拆分为基础和扩展名

时间:2010-12-28 12:14:54

标签: java file

有没有比

更好的方法来获取文件基名和扩展名
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);

8 个答案:

答案 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个文件“扩展名”正在使用中。但你会如何决定,是在最后一个点分割,还是倒数第二个点?

改为使用mime-types。

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" }

因此,您将知道数组中的最后一个索引是扩展名,而所有其他索引都是基础。