Рубрики
Без рубрики

Как получить расширение файла в Java

Мы можем использовать “Строку #lastIndexOf”, чтобы получить расширение файла на Java.

Автор оригинала: mkyong.

В этой статье показано, как получить расширение файла файла на Java.

Темы

  1. Получить расширение файла нормально
  2. Получить расширение файла строго
  3. Получить жесткий код расширения файла
  4. Общие имена файлов ввода–вывода Apache
  Path: /path/foo.txt                  -> File Extension: txt
  Path: .                              -> File Extension:
  Path: ..                             -> File Extension:
  Path: /path/run.exe                  -> File Extension: exe
  Path: /path/makefile                 -> File Extension:
  Path: /path/.htaccess                -> File Extension: htaccess
  Path: /path/.tar.gz                  -> File Extension: gz
  Path: /path/../makefile              -> File Extension:
  Path: /path/dir.test/makefile        -> File Extension:

Просмотрите приведенный выше вывод из примера строгого расширения файла Get. Для файла, у которого нет расширения, мы отобразим пустой.

1. Получите расширение файла, обычную версию.

В этом примере показано, как использовать Строку#lastIndexOf для получения расширения файла, и в большинстве случаев оно должно соответствовать.

  String extension = "";

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

Однако описанный выше метод не сработает в следующих случаях: имя каталога или путь к файлу содержат точку или двойные точки, А файл не имеет расширения.

  Path: /path/../makefile              -> File Extension: /makefile
  Path: /path/dir.test/makefile        -> File Extension: test/makefile

Полный пример.

package com.mkyong.io.howto;

public class GetFileExtension1 {

    private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s";

    public static void main(String[] args) {

        String[] files = {
                "/path/foo.txt",
                ".",
                "..",
                "/path/run.exe",
                "/path/makefile",
                "/path/.htaccess",
                "/path/.tar.gz",
                "/path/../makefile",
                "/path/dir.test/makefile"
        };

        for (String file : files) {
            String output = String.format(OUTPUT_FORMAT, file, getFileExtension(file));
            System.out.println(output);
        }

    }

    /**
     * Fail for below cases
     * 

* "/path/../makefile", * "/path/dir.test/makefile" */ public static String getFileExtension(String fileName) { if (fileName == null) { throw new IllegalArgumentException("fileName must not be null!"); } String extension = ""; int index = fileName.lastIndexOf('.'); if (index > 0) { extension = fileName.substring(index + 1); } return extension; } }

Выход

Path: /path/foo.txt                  -> File Extension: txt
Path: .                              -> File Extension:
Path: ..                             -> File Extension:
Path: /path/run.exe                  -> File Extension: exe
Path: /path/makefile                 -> File Extension:
Path: /path/.htaccess                -> File Extension: htaccess
Path: /path/.tar.gz                  -> File Extension: gz
Path: /path/../makefile              -> File Extension: /makefile
Path: /path/dir.test/makefile        -> File Extension: test/makefile

2. Получите расширение файла, строгую версию.

В этом примере реализована дополнительная проверка того, что каталог содержит точку, а файл не имеет расширения.

  Path: /path/../makefile              -> File Extension:
  Path: /path/dir.test/makefile        -> File Extension:

Дополнительная проверка гарантирует, что последний индекс расширения файла (позиция) всегда находится после последнего разделителя файлов (Windows или Unix).

  if (indexOfLastExtension > indexOflastSeparator) {
      extension = fileName.substring(indexOfLastExtension + 1);
  }

Полный пример.

package com.mkyong.io.howto;

import java.util.Map;

public class GetFileExtension2 {

    private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s";
    private static final String WINDOWS_FILE_SEPARATOR = "\\";
    private static final String UNIX_FILE_SEPARATOR = "/";
    private static final String FILE_EXTENSION = ".";

    public static void main(String[] args) {

        String[] files = {
                "/path/foo.txt",
                ".",
                "..",
                "/path/run.exe",
                "/path/makefile",
                "/path/.htaccess",
                "/path/.tar.gz",
                "/path/../makefile",
                "/path/dir.test/makefile"
        };

        for (String file : files) {
            String output = String.format(OUTPUT_FORMAT, file, getFileExtensionImproved(file));
            System.out.println(output);
        }

    }

    /**
     * Add extra checking for below cases
     * 

* "/path/../makefile", * "/path/dir.test/makefile" */ public static String getFileExtensionImproved(String fileName) { if (fileName == null) { throw new IllegalArgumentException("fileName must not be null!"); } String extension = ""; int indexOfLastExtension = fileName.lastIndexOf(FILE_EXTENSION); // check last file separator, windows and unix int lastSeparatorPosWindows = fileName.lastIndexOf(WINDOWS_FILE_SEPARATOR); int lastSeparatorPosUnix = fileName.lastIndexOf(UNIX_FILE_SEPARATOR); // takes the greater of the two values, which mean last file separator int indexOflastSeparator = Math.max(lastSeparatorPosWindows, lastSeparatorPosUnix); // make sure the file extension appear after the last file separator if (indexOfLastExtension > indexOflastSeparator) { extension = fileName.substring(indexOfLastExtension + 1); } return extension; } }

Выход

Path: /path/foo.txt                  -> File Extension: txt
Path: .                              -> File Extension:
Path: ..                             -> File Extension:
Path: /path/run.exe                  -> File Extension: exe
Path: /path/makefile                 -> File Extension:
Path: /path/.htaccess                -> File Extension: htaccess
Path: /path/.tar.gz                  -> File Extension: gz
Path: /path/../makefile              -> File Extension:
Path: /path/dir.test/makefile        -> File Extension:

3. Получить расширение файла, версия жесткого кода

В этом примере показано, как жестко закодировать некоторые расширения файлов и отобразить предопределенный результат. Например, для расширения файла .tar.gz , мы хотим отобразить tar.gz , не гз .

package com.mkyong.io.howto;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class GetFileExtension3 {

    private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s";
    private static final String WINDOWS_FILE_SEPARATOR = "\\";
    private static final String UNIX_FILE_SEPARATOR = "/";
    private static final String FILE_EXTENSION = ".";
    private static final Map KNOWN_EXTENSION = createKnownExtensionMap();

    public static void main(String[] args) {

        String[] files = {
                "/path/foo.txt",
                ".",
                "..",
                "/path/run.exe",
                "/path/makefile",
                "/path/.htaccess",
                "/path/.tar.gz",
                "/path/../makefile",
                "/path/dir.test/makefile"
        };

        for (String file : files) {
            String output = String.format(OUTPUT_FORMAT, file, getFileExtensionKnownExtension(file));
            System.out.println(output);
        }

    }

    public static String getFileExtensionImproved(String fileName) {

        if (fileName == null) {
            throw new IllegalArgumentException("fileName must not be null!");
        }

        String extension = "";

        int indexOfLastExtension = fileName.lastIndexOf(FILE_EXTENSION);

        int indexOflastSeparator = Math.max(
              fileName.lastIndexOf(WINDOWS_FILE_SEPARATOR),
              fileName.lastIndexOf(UNIX_FILE_SEPARATOR)
        );

        if (indexOfLastExtension > indexOflastSeparator) {
            extension = fileName.substring(indexOfLastExtension + 1);
        }

        return extension;

    }

    // hardcoded
    public static String getFileExtensionKnownExtension(final String fileName) {

        if (fileName == null) {
            throw new IllegalArgumentException("fileName must not be null!");
        }

        // if the file name is end with the hard coded extension.
        // Java 8 stream, loop map if key matches get value
        String extension = KNOWN_EXTENSION
                .entrySet()
                .stream()
                .filter(x -> fileName.endsWith(x.getKey()))
                .map(x -> x.getValue())
                .collect(Collectors.joining());

        if ("".equals(extension)) {
            extension = getFileExtensionImproved(fileName); // see example 2
        }

        return extension;

    }

    private static Map createKnownExtensionMap() {
        Map result = new HashMap<>();
        result.put(".tar.gz", "tar.gz");    // if .tar.gz, gets tar.gz
        result.put("makefile", "make");     // if makefile, get make
        //...extra
        return result;
    }

}

Выход

Path: /path/foo.txt                  -> File Extension: txt
Path: .                              -> File Extension:
Path: ..                             -> File Extension:
Path: /path/run.exe                  -> File Extension: exe
Path: /path/makefile                 -> File Extension: make
Path: /path/.htaccess                -> File Extension: htaccess
Path: /path/.tar.gz                  -> File Extension: tar.gz
Path: /path/../makefile              -> File Extension: make
Path: /path/dir.test/makefile        -> File Extension: make

4. Общий ввод-вывод Apache

Для Apache commons-io мы можем использовать Имя файла.getExtension(имя файла) чтобы получить расширение файла файла.

  
      commons-io
      commons-io
      2.7
  

Полный пример.

package com.mkyong.io.howto;

import org.apache.commons.io.FilenameUtils;

public class GetFileExtension4 {

    private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s";

    public static void main(String[] args) {

        String[] files = {
                "/path/foo.txt",
                ".",
                "..",
                "/path/run.exe",
                "/path/makefile",
                "/path/.htaccess",
                "/path/.tar.gz",
                "/path/../makefile",
                "/path/dir.test/makefile"
        };

        for (String file : files) {
            String output = String.format(OUTPUT_FORMAT, file, FilenameUtils.getExtension(fileName));
            System.out.println(output);
        }

    }

}

Выход

Path: /path/foo.txt                  -> File Extension: txt
Path: .                              -> File Extension:
Path: ..                             -> File Extension:
Path: /path/run.exe                  -> File Extension: exe
Path: /path/makefile                 -> File Extension:
Path: /path/.htaccess                -> File Extension: htaccess
Path: /path/.tar.gz                  -> File Extension: gz
Path: /path/../makefile              -> File Extension:
Path: /path/dir.test/makefile        -> File Extension:

Скачать Исходный Код

$клон git $клон git

$cd java-ввод-вывод

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-get-file-extension-in-java/”