为了清楚起见,我不是在寻找MIME类型。 html
假设我输入如下内容: /path/to/file/foo.txt
java
我想要一种分解此输入的方法,特别是将扩展名分解为.txt
。 在Java中是否有任何内置方法能够作到这一点? 我想避免编写本身的解析器。 git
怎么样(使用Java 1.5 RegEx): github
String[] split = fullFileName.split("\\."); String ext = split[split.length - 1];
若是使用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
这是一种能够正确处理.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
在这种状况下,请使用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
只是基于正则表达式的选择。 没有那么快,没有那么好。
Pattern pattern = Pattern.compile("\\.([^.]*)$"); Matcher matcher = pattern.matcher(fileName); if (matcher.find()) { String ext = matcher.group(1); }