Wiem, że inni wspominali String.split, ale tutaj jest wariant, który daje tylko dwa tokeny (podstawa i rozszerzenie):
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
Na przykład:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
Plony:
["test.cool.awesome", "txt"]
Wyrażenie regularne nakazuje Javie podzielić na dowolny okres, po którym następuje dowolna liczba znaków bez kropek, po których następuje koniec danych wejściowych. Jest tylko jeden okres, który pasuje do tej definicji (a mianowicie ostatni okres).
Technicznie rzecz biorąc, mówiąc regeksyjnie, technika ta nazywana jest dodatnim wyprzedzeniem o zerowej szerokości .
BTW, jeśli chcesz podzielić ścieżkę i uzyskać pełną nazwę pliku, w tym między innymi rozszerzenie kropki, używając ścieżki z ukośnikami,
String[] tokens = dir.split(".+?/(?=[^/]+$)");
Na przykład:
String dir = "/foo/bar/bam/boozled";
String[] tokens = dir.split(".+?/(?=[^/]+$)");
FilenameUtils. Ma metodygetBaseName(..)igetExtension(..).