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

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

假设我输入如下内容: /path/to/file/foo.txt java

我想要一种分解此输入的方法,特别是将扩展名分解为.txt 。 在Java中是否有任何内置方法能够作到这一点? 我想避免编写本身的解析器。 git


#1楼

怎么样(使用Java 1.5 RegEx): github

String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];

#2楼

若是使用Guava库,则能够使用Files实用程序类。 它具备特定的方法getFileExtension() 。 例如: web

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

此外,您还能够使用相似的函数getNameWithoutExtension()得到文件名: 正则表达式

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo

#3楼

这是一种能够正确处理.tar.gz的方法,即便在目录名称中包含点的路径中也是如此: apache

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlash的建立是为了使afterLastBackslash查找更快,由于若是其中包含一些斜杠,则没必要搜索整个字符串。 api

原始String内的char[]被重用,并无在其中添加任何垃圾, JVM可能会注意到afterLastSlash当即成为垃圾,以便将其放入堆栈而不是堆中maven


#4楼

在这种状况下,请使用Apache Commons IO的 FilenameUtils.getExtension 函数

这是一个使用方法的示例(您能够指定完整路径或仅指定文件名):

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

Maven的依赖:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Gradle Groovy DSL

implementation 'commons-io:commons-io:2.6'

Gradle Kotlin DSL

implementation("commons-io:commons-io:2.6")

其余https://search.maven.org/artifact/commons-io/commons-io/2.6/jar


#5楼

只是基于正则表达式的选择。 没有那么快,没有那么好。

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}
相关文章
相关标签/搜索