Żeby było jasne, nie szukam typu MIME.
Powiedzmy, że mam następujące dane wejściowe: /path/to/file/foo.txt
Chciałbym znaleźć sposób na rozbicie tego wejścia, szczególnie na .txt
rozszerzenie. Czy jest jakiś sposób, aby to zrobić w Javie? Chciałbym uniknąć pisania własnego parsera.
"txt"
z"filename.txt"
ponieważ niektóre platformy gdzieś może chcieć użyć"filename,txt"
.path.substring(path.lastIndexOf("."));
... I tak .. Z pewnością niczego nie skopiują za darmo ...".txt"
z"filename.txt"
, co może nie być pożądany efekt, a co najgorsze, nie jest on zStringIndexOutOfBoundsException
zamiast wrócić pusty ciąg jeśli nie ma rozszerzenie.Odpowiedzi:
W takim przypadku użyj pliku FilenameUtils.getExtension z Apache Commons IO
Oto przykład, jak z niego korzystać (możesz podać pełną ścieżkę lub po prostu nazwę pliku):
Zależność od Maven:
Gradle Groovy DSL
Gradle Kotlin DSL
Inne https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
źródło
Czy naprawdę potrzebujesz do tego „parsera”?
Zakładając, że masz do czynienia z prostymi nazwami plików podobnymi do systemu Windows, a nie czymś takim
archive.tar.gz
.Przy okazji, w przypadku, gdy katalog może mieć „.”, Ale sama nazwa pliku nie (jak
/path/to.a/file
), możesz to zrobićźródło
i > 0
należy zmienić nai >= 0
lubi != -1
. To zajmuje się nazwami plików jak.htaccess
.źródło
Jeśli korzystasz z biblioteki Guava , możesz skorzystać z
Files
klasy użytkowej. Ma specyficzny sposób,getFileExtension()
. Na przykład:Ponadto możesz również uzyskać nazwę pliku z podobną funkcją getNameWithoutExtension () :
źródło
getFileExtension
to nie jest toint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
nic wielkiego. zwróć też uwagę, żeFiles
z jakiegoś powodu oznaczone jako „niestabilne”.Jeśli na Androidzie możesz użyć tego:
źródło
Aby uwzględnić nazwy plików bez znaków przed kropką, musisz użyć tej niewielkiej odmiany zaakceptowanej odpowiedzi:
źródło
To jest sprawdzona metoda
I przypadek testowy:
źródło
Mój brudny i może najmniejszy przy użyciu String.replaceAll :
Zauważ, że najpierw
*
jest chciwy, więc złapie jak najwięcej znaków, a potem tylko ostatnia kropka i rozszerzenie pliku pozostanie.źródło
.replaceAll(".*\\.", "")
zwróć „.txt”
jeśli chcesz tylko „txt”, make
path.lastIndexOf(".") + 1
źródło
Jak wynika z wszystkich pozostałych odpowiedzi, nie ma odpowiedniej „wbudowanej” funkcji. Jest to bezpieczna i prosta metoda.
źródło
Co powiesz na (przy użyciu Java 1.5 RegEx):
źródło
Jeśli planujesz używać Apache commons-io, a po prostu chcesz sprawdzić rozszerzenie pliku, a następnie wykonać jakąś operację, możesz użyć tego , oto fragment kodu:
źródło
Oto kolejna linijka dla Java 8.
Działa w następujący sposób:
źródło
Co powiesz na JFileChooser? Nie jest to proste, ponieważ trzeba będzie przeanalizować końcowy wynik ...
który jest typem MIME ...
OK ... Zapominam, że nie chcesz znać jego typu MIME.
Interesujący kod w następującym linku: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html
Powiązane pytanie: Jak przyciąć rozszerzenie pliku z ciągu w Javie?
źródło
Oto metoda, która obsługuje się
.tar.gz
poprawnie, nawet w ścieżce z kropkami w nazwach katalogów:afterLastSlash
jest tworzony, aby wyszukiwanie byłoafterLastBackslash
szybsze, ponieważ nie będzie musiał przeszukiwać całego łańcucha, jeśli są w nim jakieś ukośniki.char[]
Wewnątrz oryginałuString
jest wykorzystywany, dodając tam nie śmieci, a JVM będzie zapewne zauważyć, żeafterLastSlash
jest natychmiast śmieci, aby umieścić go na stosie zamiast stercie .źródło
getExtension
funkcją. Jeśli nazwa pliku użytkownika to"my zip. don't touch.tar.gz"
ta metoda, zwróci nieprawidłowe rozszerzenie.rozszerzenie powinno zawierać „.txt” podczas uruchamiania.
źródło
Oto wersja z Opcjonalną jako wartością zwracaną (ponieważ nie możesz mieć pewności, że plik ma rozszerzenie) ... również sprawdzenie poprawności ...
źródło
Co powiesz na wersję REGEX :
lub z obsługiwanym rozszerzeniem zerowym:
wynik dla * nix:
ścieżka: / root / docs /
name: readme
Rozszerzenie: txt
dla Windows, parsePath ("c: \ windows \ readme.txt"):
ścieżka: c: \ windows \
name: readme
Rozszerzenie: txt
źródło
źródło
Tutaj stworzyłem małą metodę (jednak nie tak bezpieczną i nie sprawdzającą wielu błędów), ale jeśli tylko ty programujesz ogólny program Java, jest to więcej niż wystarczające, aby znaleźć typ pliku. Nie działa to w przypadku złożonych typów plików, ale zwykle nie są one tak często używane.
źródło
lastIndexOf
aby nazwy plikówjohn.smith.report.doc
były traktowane poprawnie. (2) Należy prawidłowo obsługiwać przypadki, gdy nie ma rozszerzenia. Ta metoda zwracaABC/XYZ
ścieżkę typuabc/xyz
, co nie ma żadnego sensu. Bardziej sensowny byłby powrót""
lubnull
. (3) Separator plików nie zawsze/
.Pobieranie rozszerzenia pliku z nazwy pliku
Kredyty
źródło
Bez użycia biblioteki możesz użyć metody String podzielonej w następujący sposób:
źródło
Tylko alternatywa oparta na wyrażeniach regularnych. Nie tak szybko, nie tak dobrze.
źródło
Znalazłem lepszy sposób na znalezienie rozszerzenia, mieszając wszystkie powyższe odpowiedzi
źródło
Podoba mi się prostota odpowiedzi widma , a w jednym z jego komentarzy jest link do innej odpowiedzi, która naprawia kropki w ścieżkach plików, na inne pytanie, zadane przez EboMike .
Bez implementacji interfejsu API innej firmy sugeruję:
Coś takiego może być przydatne, powiedzmy, w dowolnej z
write
metod ImageIO , w których należy przekazać format pliku.Po co korzystać z interfejsu API całej firmy, kiedy można samodzielnie wykonać majsterkowanie?
źródło
To szczególne pytanie sprawiło mi wiele problemów, a potem znalazłem bardzo proste rozwiązanie tego problemu, który tutaj zamieszczam.
Otóż to.
źródło
Spróbuj tego.
źródło
źródło
Java ma wbudowany sposób radzenia sobie z tym, w klasie java.nio.file.Files , który może działać na Twoje potrzeby:
Zauważ, że ta statyczna metoda wykorzystuje podane tutaj specyfikacje , aby pobrać „typ zawartości”, który może się różnić.
źródło