如何在Java中获取文件的文件扩展名?

lon*_*gda 457 java io file

为了清楚起见,我不是在寻找MIME类型.

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

我想要一种方法来打破这种输入,特别.txt是扩展.在Java中有没有内置的方法来做到这一点?我想避免编写自己的解析器.

Jua*_*jas 622

在这种情况下,使用FilenameUtils.getExtensionApache的百科全书IO

以下是如何使用它的示例(您可以指定完整路径或仅指定文件名):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"
Run Code Online (Sandbox Code Playgroud)

  • @Zitrax那是因为"gz"是文件扩展名. (101认同)
  • 应该注意,它只返回名为archive.tar.gz的文件的"gz". (69认同)
  • @zhelon [.gz](https://en.wikipedia.org/wiki/Gzip)代表gnu压缩文件和[.tar](https://en.wikipedia.org/wiki/Tar_(computing))代表(t)猿(ar)韭菜.所以.tar.gz是gnu压缩文件中的tar文件,其扩展名为.gz. (30认同)
  • @ BrainSlugs83那么什么意思是"焦油"? (6认同)
  • @ guru_001当然不是,它只是提到你可以用完整路径或文件名来称呼它. (2认同)
  • 没有理由为此简单任务引入另一个库。 (2认同)

Ebo*_*ike 291

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

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}
Run Code Online (Sandbox Code Playgroud)

假设您正在处理类似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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为`i> 0`应该改为`i> = 0`或`i!= -1`.这会处理像`.htaccess`这样的文件名. (11认同)
  • 正如你所说,除了使用天真的lastIndexOf(".")之外,还有许多事情要考虑.我猜想Apache Commons有一个方法,它考虑了所有棘手的潜在问题. (10认同)
  • 无论任何代码片段是多么简单......你仍然需要更新它/维护它/测试它/使它可用作方便的依赖...如果已经有一个lib做了所有这些,那就容易多了 (6认同)
  • 谢谢!当然你可能需要一个解析器/对象,如果你想做更多的操作而不仅仅是扩展...说你只想要路径,父目录,文件名(减去扩展名)等等.我来自C#和.Net,我们有这个:http://msdn.microsoft.com/en-us/library/system.io.fileinfo_members.aspx (4认同)
  • 更多问题是如果文件以点结尾.更好的lib.if(i> p && i <(fileName.length() - 1)){extension = fileName.substring(i + 1); (2认同)

luk*_*985 93

private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,这会返回'.' 同样,你的文件扩展名为'.txt'而不是其他一些答案中的'txt' (12认同)
  • 在某些情况下,这种方法可能不起作用,例如/usr/bin/foo.bar/httpconf (11认同)
  • @ lukasz1985 1.数百个linux软件包创建名称为"init.d"的目录,而且依赖于没有带点目录的路径是不安全的,因为它不是非法的2.我正在为Android编码所以我使用了一些SDK方法我不记得,但我猜http://stackoverflow.com/a/3571239/2546146没有这个缺陷 (8认同)
  • @Iman Akbari:getName()只返回文件名本身,在你的例子中是"httpconf". (3认同)
  • 更好的答案和@NickEntin 更好的评论。去掉句号“.” 从文件的扩展名,可以编码为 int lastIndexOf = name.lastIndexOf(".") + 1; (2认同)
  • 你不应该依赖例外来防止草率编码.此处不需要异常处理. (2认同)

Jea*_*ean 82

如果您使用Guava库,则可以使用Files实用程序类.它有一个特定的方法,getFileExtension().例如:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt
Run Code Online (Sandbox Code Playgroud)

此外,您还可以获取具有类似函数的文件名getNameWithoutExtension():

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo
Run Code Online (Sandbox Code Playgroud)

  • 真?这是一个很棒的图书馆,充满了实用工具.他们中的大多数将成为Java8的一部分,就像伟大的Guava [功能](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html). (4认同)

int*_*dis 27

如果在Android上,您可以使用此:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());
Run Code Online (Sandbox Code Playgroud)


Syl*_*oux 14

为了在点之前考虑没有字符的文件名,您必须使用接受答案的轻微变化:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}
Run Code Online (Sandbox Code Playgroud)
"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"
Run Code Online (Sandbox Code Playgroud)


yav*_*vus 13

这是一种经过测试的方法

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

和测试用例:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}
Run Code Online (Sandbox Code Playgroud)


Ebr*_*owi 10

我的脏,可能最小的使用String.replaceAll:

.replaceAll("^.*\\.(.*)$", "$1")
Run Code Online (Sandbox Code Playgroud)

请注意,首先*是贪婪,所以它会尽可能地抓取大多数可能的字符,然后只剩下最后一个点和文件扩展名.

  • 或者更短的 `.replaceAll(".*\\.", "")` (2认同)

int*_*dis 9

从所有其他答案中可以明显看出,没有足够的"内置"功能.这是一种安全而简单的方法.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

如果您在项目中使用 Spring 框架,那么您可以使用StringUtils

import org.springframework.util.StringUtils;

StringUtils.getFilenameExtension("YourFileName")
Run Code Online (Sandbox Code Playgroud)


Nik*_*las 9

Java 20 EA

从 Java 20 EA(早期访问)开始,终于有一个新方法Path#getExtension将扩展名返回为String

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
Run Code Online (Sandbox Code Playgroud)


Nin*_*hra 7

怎么样(使用Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];
Run Code Online (Sandbox Code Playgroud)

  • 没有扩展时会出错 (5认同)

Gen*_*wen 6

如果你打算使用Apache commons-io,只想检查文件的扩展名然后做一些操作,你可以使用,这里是一个片段:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}
Run Code Online (Sandbox Code Playgroud)


Vel*_*lse 5

String path = "/Users/test/test.txt"

String extension = path.substring(path.lastIndexOf("."), path.length());
Run Code Online (Sandbox Code Playgroud)

返回“ .txt”

如果只需要“ txt”,请 path.lastIndexOf(".") + 1


小智 5

这是Java 8的另一种形式。

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)
Run Code Online (Sandbox Code Playgroud)

其工作方式如下:

  1. 使用“。”将字符串拆分为字符串数组。
  2. 将数组转换为流
  3. 使用reduce获取流的最后一个元素,即文件扩展名