Czy jest lepszy sposób na uzyskanie nazwy i rozszerzenia pliku niż coś takiego
File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
FilenameUtils
. Ma metodygetBaseName(..)
igetExtension(..)
.Odpowiedzi:
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).
Technicznierzecz 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(".+?/(?=[^/]+$)"); // [ "/foo/bar/bam/" "boozled" ]
źródło
Stare pytanie, ale zwykle używam tego rozwiązania:
import org.apache.commons.io.FilenameUtils; String fileName = "/abc/defg/file.txt"; String basename = FilenameUtils.getBaseName(fileName); String extension = FilenameUtils.getExtension(fileName); System.out.println(basename); // file System.out.println(extension); // txt (NOT ".txt" !)
źródło
Źródło: http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm
taka klasa użyteczności:
class Filename { private String fullPath; private char pathSeparator, extensionSeparator; public Filename(String str, char sep, char ext) { fullPath = str; pathSeparator = sep; extensionSeparator = ext; } public String extension() { int dot = fullPath.lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); } public String filename() { // gets filename without extension int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); } public String path() { int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(0, sep); } }
stosowanie:
public class FilenameDemo { public static void main(String[] args) { final String FPATH = "/home/mem/index.html"; Filename myHomePage = new Filename(FPATH, '/', '.'); System.out.println("Extension = " + myHomePage.extension()); System.out.println("Filename = " + myHomePage.filename()); System.out.println("Path = " + myHomePage.path()); } }
źródło
basename()
byłoby lepszą nazwą zamiastfilename()
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName ()
Od http://www.xinotes.org/notes/note/774/ :
Java ma wbudowane funkcje, aby uzyskać podstawową nazwę i nazwę katalogu dla danej ścieżki pliku, ale nazwy funkcji nie są tak oczywiste.
import java.io.File; public class JavaFileDirNameBaseName { public static void main(String[] args) { File theFile = new File("../foo/bar/baz.txt"); System.out.println("Dirname: " + theFile.getParent()); System.out.println("Basename: " + theFile.getName()); } }
źródło
Rozszerzenia plików to zepsuta koncepcja
I nie istnieje żadnej niezawodne działanie dla niego. Rozważmy na przykład tę nazwę pliku:
Co to jest rozszerzenie? Użytkownicy DOS woleliby tę nazwę
archive.tgz
. Czasami widzisz głupie aplikacje Windows, które najpierw dekompresują plik (dając.tar
plik), a następnie musisz go ponownie otworzyć, aby zobaczyć zawartość archiwum.W takim przypadku bardziej rozsądne byłoby pojęcie rozszerzenia pliku
.tar.gz
. Istnieje również.tar.bz2
,.tar.xz
,.tar.lz
a.tar.lzma
plik „Rozszerzenia” w użyciu. Ale jak zdecydowałbyś, czy podzielić na ostatnią kropkę, czy przedostatnią kropkę?Zamiast tego użyj typów MIME.
Funkcja Files.probeContentType języka Java 7 będzie prawdopodobnie znacznie bardziej niezawodna w wykrywaniu typów plików niż ufanie rozszerzeniu pliku. Prawie cały świat Unix / Linux, a także Twoja przeglądarka internetowa i smartfon już to robią.
źródło
File
niePath
pozwól mi oddzielić rozszerzenia..tar.gz
porównaniu z.tgz
zbyt powszechnymi na unixach). Zamiast tego użyj typów MIME.Files.probeContentType
zamiast polegania na nazwie pliku, aby mieć właściwe rozszerzenie?Co jest nie tak z twoim kodem? Zapakowany w zgrabną metodę użytkową jest w porządku.
Ważniejsze jest to, czego użyć jako separatora - pierwszej lub ostatniej kropki. Pierwszy jest zły dla nazw plików, takich jak „setup-2.5.1.exe”, a ostatni jest zły dla nazw plików z wieloma rozszerzeniami, na przykład „mybundle.tar.gz”.
źródło
Możesz także użyć wyrażenia regularnego java. String.split () również używa wyrażenia wewnętrznie. Zobacz http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
źródło
Może mógłbyś użyć String # split
Aby odpowiedzieć na Twój komentarz:
Nie jestem pewien, czy może być więcej niż jeden. w nazwie pliku, ale cokolwiek, nawet jeśli jest więcej kropek, możesz użyć podziału. Weź pod uwagę np., Że:
String input = "boo.and.foo"; String[] result = input.split(".");
To zwróci tablicę zawierającą:
{ "boo", "and", "foo" }
Będziesz więc wiedział, że ostatni indeks w tablicy jest rozszerzeniem, a wszystkie inne są podstawą.
źródło
.
w ciągufileName.split("\\.(?=[^\\.]+$)")