爲了清楚起見,我不是在尋找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); }