明确一点,我并不是在寻找MIME类型。

假设我有以下输入:/path/to/file/foo.txt

我想要一种方法来分解这个输入,特别是扩展为.txt。在Java中有任何内置的方法来做到这一点吗?我希望避免编写自己的解析器。


当前回答

  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }

其他回答

我喜欢spectre简单的回答,在他的一个评论中有一个链接到另一个由EboMike提出的问题,它修复了文件路径中的点。

在不实现某种第三方API的情况下,我建议:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

类似的东西在ImageIO的任何写入方法中都可能有用,其中必须传入文件格式。

既然可以自己动手,为什么还要使用整个第三方API呢?

JFileChooser怎么样?这并不简单,因为你需要解析它的最终输出…

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

这是一个MIME类型…

好吧……我忘了你不想知道它的MIME类型。

下面链接中的有趣代码: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

相关问题: 我如何修剪一个文件扩展名从一个字符串在Java?

Java 20 EA

从Java 20 EA(早期访问)开始,终于有了一个新方法Path#getExtension,它将扩展名作为字符串返回:

Paths.get("/Users/admin/notes.txt").getExtension();              // "txt"
Paths.get("/Users/admin/.gitconfig").getExtension();             // "gitconfig"
Paths.get("/Users/admin/configuration.xml.zip").getExtension();  // "zip"
Paths.get("/Users/admin/file").getExtension();                   // null

你真的需要一个“解析器”吗?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

假设您正在处理简单的类似windows的文件名,而不是像archive.tar.gz这样的文件名。

顺便说一下,对于目录可能有一个'。',但文件名本身没有(像/path/to.a/file),你可以这样做

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}

这个特别的问题给了我很多麻烦,然后我找到了一个非常简单的解决方案,我张贴在这里。

file.getName().toLowerCase().endsWith(".txt");

就是这样。