Jak uzyskać rozszerzenie pliku w Javie?


484

Ż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 .txtrozszerzenie. Czy jest jakiś sposób, aby to zrobić w Javie? Chciałbym uniknąć pisania własnego parsera.


12
Nigdy nie wiadomo, kiedy pojawi się nowa platforma, która definiuje rozszerzenia jako oddzielone przecinkiem. Teraz musisz napisać kod zależny od platformy. Frameworki Java powinny być bardziej przyszłościowe i mieć interfejsy API do uzyskiwania rozszerzeń, w których piszą kod zależny od platformy, a ty, jako użytkownik interfejsu API, powiedz tylko pobierz rozszerzenie.
ArtOfWarfare

@ArtOfWarfare: OMG. Stwórzmy 100MB JRE z wieloma tysiącami klas, ale pamiętaj, aby nie realizować żadnej metody, która powraca "txt"z "filename.txt"ponieważ niektóre platformy gdzieś może chcieć użyć "filename,txt".
Eric Duminil

@EricDuminil „Pamiętaj, aby nie wdrożyć żadnej metody, która zwraca„ txt ”z„ filename.txt ”„ ??? Spróbuj path.substring(path.lastIndexOf("."));... I tak .. Z pewnością niczego nie skopiują za darmo ...
VelocityPulse

@VelocityPulse To dokładnie to, co mnie martwi. Ponieważ nie ma standardowego sposobu uzyskania rozszerzenia pliku, otrzymujesz dziesiątki błędnych odpowiedzi i nieco inne implementacje. Kod wykorzystuje 2 sposoby (chciałbym mieć jeden pojedynczy, wyraźny sposób), powraca ".txt"z "filename.txt", co może nie być pożądany efekt, a co najgorsze, nie jest on z StringIndexOutOfBoundsExceptionzamiast wrócić pusty ciąg jeśli nie ma rozszerzenie.
Eric Duminil

Odpowiedzi:


649

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):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

Zależność od 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")

Inne https://search.maven.org/artifact/commons-io/commons-io/2.6/jar


70
Należy zauważyć, że zwraca tylko „gz” dla pliku o nazwie archive.tar.gz.
Zitrax

106
@ Zitrax, ponieważ „gz” jest rozszerzeniem pliku.
BrainSlugs83

6
@ BrainSlugs83 Co więc oznacza „tar”?
TuGordoBello

31
@zhelon .gz oznacza spakowany plik GNU , a .tar oznacza (t) ape (ar) szczypiorek. Tak więc .tar.gz jest plikiem tar wewnątrz spakowanego pliku GNU, który ma rozszerzenie .gz.
cirovladimir

5
Nie ma powodu, aby przynosić inną bibliotekę do tego prostego zadania.
masterwok

311

Czy naprawdę potrzebujesz do tego „parsera”?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

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ć

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}

4
Dzięki! Pewnie możesz potrzebować do tego parsera / obiektu, jeśli chcesz wykonać więcej manipulacji niż tylko rozszerzenie ... powiedz, że chcesz tylko ścieżkę, katalog nadrzędny, nazwę pliku (minus rozszerzenie) itp. I ' m pochodzących z C # i .Net, gdzie mamy to: msdn.microsoft.com/en-us/library/…
longda

10
Jak mówisz, jest wiele rzeczy do przemyślenia, poza zwykłym użyciem naiwnego lastIndexOf („.”). Domyślam się, że Apache Commons ma do tego metodę, która bierze pod uwagę wszystkie małe trudne problemy.
MatrixFrog,

12
Myślę, że i > 0należy zmienić na i >= 0lub i != -1. To zajmuje się nazwami plików jak .htaccess.
Pijusn

8
bez względu na to, jak prosty jest dowolny fragment kodu ... nadal musisz go zaktualizować / utrzymać / przetestować / udostępnić jako wygodną zależność ... o wiele łatwiej, jeśli lib już to robił
Don Cheadle

2
Więcej gotcha jest, jeśli plik kończy się kropką. Lepiej w lib. if (i> p && i <(fileName.length () - 1)) {extension = fileName.substring (i + 1);
tgkprog,

97
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}

13
Należy zauważyć, że zwraca to „.” również rozszerzenie pliku będzie mieć rozszerzenie „.txt” w przeciwieństwie do „txt” w niektórych innych odpowiedziach
NickEntin

2
Lepsza odpowiedź i @NickEntin Lepszy komentarz. Aby usunąć kropkę „.” z rozszerzenia pliku można zakodować jako int lastIndexOf = name.lastIndexOf (".") + 1;
Hanzallah Afgan

11
takie podejście może w niektórych przypadkach nie działać, np. /usr/bin/foo.bar/httpconf
Iman Akbari

8
@ lukasz1985 1. setki pakietów linuksowych tworzą katalogi o nazwach takich jak „init.d”, ponadto nie jest bezpiecznie polegać na ścieżce bez katalogów z kropkami, ponieważ nie jest to nielegalne 2. Kodowałem dla Androida, więc użyłem SDK metoda, której nie pamiętam, ale wydaje mi się, że stackoverflow.com/a/3571239/2546146 nie ma tej wady
Iman Akbari

6
@Iman Akbari: getName () zwraca tylko samą nazwę pliku, która w twoim przykładzie byłaby „httpconf”.
Prezydent Dreamspace

85

Jeśli korzystasz z biblioteki Guava , możesz skorzystać z Filesklasy użytkowej. Ma specyficzny sposób, getFileExtension(). Na przykład:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

Ponadto możesz również uzyskać nazwę pliku z podobną funkcją getNameWithoutExtension () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo

4
Naprawdę? To świetna biblioteka, pełna narzędzi. Większość z nich będzie częścią Java8, podobnie jak świetna funkcja Guava .
JeanValjean

Niestety nie wszyscy ludzie mogą zdecydować, których bibliotek użyć. Przynajmniej mamy Apache Commons, choć stary.
Lluis Martinez

1
jeśli widzisz kod źródłowy, getFileExtensionto nie jest to int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)nic wielkiego. zwróć też uwagę, że Filesz jakiegoś powodu oznaczone jako „niestabilne”.
Al-Mothafar,

@ Al-Mothafar wiele klas jest oznaczonych jako niestabilne (patrz konstruktory wielu map), nie rozumiem również, dlaczego: wydano kilka wydanych, ale tam nic się nie zmieniło.
JeanValjean


14

Aby uwzględnić nazwy plików bez znaków przed kropką, musisz użyć tej niewielkiej odmiany zaakceptowanej odpowiedzi:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"

prawdopodobnie powinien obronić się przed „foo”. Wejście.
chrisinmtown,

14

To jest sprawdzona metoda

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

I przypadek testowy:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}

10

Mój brudny i może najmniejszy przy użyciu String.replaceAll :

.replaceAll("^.*\\.(.*)$", "$1")

Zauważ, że najpierw *jest chciwy, więc złapie jak najwięcej znaków, a potem tylko ostatnia kropka i rozszerzenie pliku pozostanie.


Nie powiedzie się, jeśli plik nie ma rozszerzenia.
Zack

Tak, niestety, jednak nadal można go używać w prostych scenariuszach, takich jak szybkie wykrywanie typu pliku i np. Posiadanie niepoprawnego rozszerzenia nie różni się niczym od braku, lub można ustawić warunek if, gdy wynik zamiany jest równy wejściowi.
Ebrahim Byagowi

1
Lub nawet krócej.replaceAll(".*\\.", "")
Ebrahim Byagowi

10
String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

zwróć „.txt”

jeśli chcesz tylko „txt”, make path.lastIndexOf(".") + 1


9

Jak wynika z wszystkich pozostałych odpowiedzi, nie ma odpowiedniej „wbudowanej” funkcji. Jest to bezpieczna i prosta metoda.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}

7

Co powiesz na (przy użyciu Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];

6

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:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}

Pamiętaj, że w tej kontroli rozróżniana jest wielkość liter zgodnie z dokumentami.
Babken Vardanyan

6

Oto kolejna linijka dla Java 8.

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

Działa w następujący sposób:

  1. Podziel ciąg na tablicę ciągów za pomocą „.”
  2. Przekształć tablicę w strumień
  3. Użyj zmniejsz, aby uzyskać ostatni element strumienia, tj. Rozszerzenie pliku

4

Co powiesz na JFileChooser? Nie jest to proste, ponieważ trzeba będzie przeanalizować końcowy wynik ...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

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

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

Powiązane pytanie: Jak przyciąć rozszerzenie pliku z ciągu w Javie?


4

Oto metoda, która obsługuje się .tar.gzpoprawnie, nawet w ścieżce z kropkami w nazwach katalogów:

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);
}

afterLastSlashjest tworzony, aby wyszukiwanie było afterLastBackslashszybsze, ponieważ nie będzie musiał przeszukiwać całego łańcucha, jeśli są w nim jakieś ukośniki.

char[]Wewnątrz oryginału Stringjest wykorzystywany, dodając tam nie śmieci, a JVM będzie zapewne zauważyć, że afterLastSlashjest natychmiast śmieci, aby umieścić go na stosie zamiast stercie .


ta metoda jest kopiowana z kodu źródłowego Guava, musisz o tym wspomnieć.
humazed

1
Nie skopiowałem tego. Jeśli jest w kodzie źródłowym Guava, skopiowali go stąd. Być może powiadomić ich.
Olathe

przepraszam, że to nie jest identyczne btw, więc może ty i twórca Guava macie ten sam pomysł.
humazed

2
Naprawdę „gz” jest poprawnym rozszerzeniem do powrotu. Jeśli kod wywołujący może również obsługiwać „tar”, powinien dodatkowo sprawdzić, poza getExtensionfunkcją. Jeśli nazwa pliku użytkownika to "my zip. don't touch.tar.gz"ta metoda, zwróci nieprawidłowe rozszerzenie.
intrepidis,

2
// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

rozszerzenie powinno zawierać „.txt” podczas uruchamiania.


13
Awaria, jeśli nazwa nie ma rozszerzenia.
EboMike,

2

Oto wersja z Opcjonalną jako wartością zwracaną (ponieważ nie możesz mieć pewności, że plik ma rozszerzenie) ... również sprawdzenie poprawności ...

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}

2

Co powiesz na wersję REGEX :

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

lub z obsługiwanym rozszerzeniem zerowym:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

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


1
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");

1

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.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}

OP szuka wbudowanej metody
Panther

(1) Powinieneś używać, lastIndexOfaby nazwy plików john.smith.report.docbyły traktowane poprawnie. (2) Należy prawidłowo obsługiwać przypadki, gdy nie ma rozszerzenia. Ta metoda zwraca ABC/XYZścieżkę typu abc/xyz, co nie ma żadnego sensu. Bardziej sensowny byłby powrót ""lub null. (3) Separator plików nie zawsze /.
Radiodef,

1

Pobieranie rozszerzenia pliku z nazwy pliku

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfExtension(String filename) {
    if (filename == null) {
        return -1;
    }
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
    int lastSeparator = indexOfLastSeparator(filename);
    return (lastSeparator > extensionPos ? -1 : extensionPos);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfLastSeparator(String filename) {
    if (filename == null) {
        return -1;
    }
    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
    return Math.max(lastUnixPos, lastWindowsPos);
}

Kredyty

  1. Skopiowano z Apache FileNameUtils Class - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils. getExtension% 28java.lang.String% 29

1

Bez użycia biblioteki możesz użyć metody String podzielonej w następujący sposób:

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }

0

Tylko alternatywa oparta na wyrażeniach regularnych. Nie tak szybko, nie tak dobrze.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}

0

Znalazłem lepszy sposób na znalezienie rozszerzenia, mieszając wszystkie powyższe odpowiedzi

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }

0

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ę:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

Coś takiego może być przydatne, powiedzmy, w dowolnej z writemetod ImageIO , w których należy przekazać format pliku.

Po co korzystać z interfejsu API całej firmy, kiedy można samodzielnie wykonać majsterkowanie?


0

To szczególne pytanie sprawiło mi wiele problemów, a potem znalazłem bardzo proste rozwiązanie tego problemu, który tutaj zamieszczam.

file.getName().toLowerCase().endsWith(".txt");

Otóż ​​to.


3
OP Potrzebuje sposobu na wyodrębnienie rozszerzenia - nie testowanie go.
Predrag Manojlovic

właściwie cokolwiek rozwijasz w większości przypadków, musisz zajmować się tylko określonym typem plików .. więc jeśli twój problem pojawi się w tym obszarze, to ci pomoże.
Vikram Bhardwaj

4
Co nie spełnia jego wymagań
Predrag Manojlovic

2
To nie jest odpowiedź na pytanie, ale rzeczywiście tego właśnie szukałem.
Ediolot,

-1

Spróbuj tego.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg

-1
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }

-4

Java ma wbudowany sposób radzenia sobie z tym, w klasie java.nio.file.Files , który może działać na Twoje potrzeby:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

Zauważ, że ta statyczna metoda wykorzystuje podane tutaj specyfikacje , aby pobrać „typ zawartości”, który może się różnić.


28
To jest niepoprawne. Typ zwracany dla probeContentType to typ zawartości Mime, a nie rozszerzenie pliku. Zwykle nie pasuje do rozszerzenia. Byłoby to również dość powolne w przeglądarce plików, ponieważ faktycznie otwiera plik, aby określić typ.
Charles,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.