Как я могу получить расширение файла в Java? - PullRequest
434 голосов
/ 26 августа 2010

Просто чтобы прояснить, я не ищу тип MIME.

Допустим, у меня есть следующий ввод: /path/to/file/foo.txt

Я бы хотел, чтобы это сломалосьвведите, в частности, .txt для расширения.Есть ли способ сделать это в Java?Я бы не хотел писать свой собственный парсер.

Ответы [ 29 ]

6 голосов
/ 10 апреля 2013

Как насчет (с использованием Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];
4 голосов
/ 24 августа 2017
String path = "/Users/test/test.txt"

String extension = path.substring(path.lastIndexOf("."), path.length());

вернуть ".txt"

, если вы хотите только "txt", сделайте path.lastIndexOf(".") + 1

4 голосов
/ 14 апреля 2013

Вот метод, который обрабатывает .tar.gz правильно, даже в пути с точками в именах каталогов:

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

afterLastSlash создан для ускорения поиска afterLastBackslash, так как он не будет иметьискать всю строку, если в ней есть некоторые слэши.

char[] внутри оригинального String используется повторно, не добавляя мусора, и JVM, вероятно, заметит, что afterLastSlashнемедленно мусор, чтобы поместить его в стек вместо кучи .

4 голосов
/ 26 августа 2010

Как насчет JFileChooser? Это не просто, так как вам нужно будет проанализировать окончательный результат ...

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

тип MIME ...

ОК ... Я забыл, что вы не хотите знать его MIME-тип.

Интересный код по следующей ссылке: 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;
}

Похожие вопросы: Как мне обрезать расширение файла из строки в Java?

3 голосов
/ 29 января 2019

Вот еще один однострочный текст для Java 8.

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

Он работает следующим образом:

  1. Разделить строку на массив строк, используя "."
  2. Преобразование массива в поток
  3. Используйте команду Reduce, чтобы получить последний элемент потока, то есть расширение файла
2 голосов
/ 17 февраля 2017

Вот версия с Optional в качестве возвращаемого значения (потому что вы не можете быть уверены, что у файла есть расширение) ... также проверки работоспособности ...

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 голосов
/ 30 января 2017

Как насчет 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));
}

или с поддерживаемым нулевым расширением:

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

результат для * nix:
путь: / root / docs /
имя: readme
Расширение: TXT

для windows, parsePath ("c: \ windows \ readme.txt"):
путь: c: \ windows \
имя: readme
Расширение: TXT

2 голосов
/ 26 августа 2010
// Modified from EboMike's answer

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

расширение должно иметь ".txt" при запуске.

1 голос
/ 24 мая 2015
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");
1 голос
/ 23 июня 2017

Без использования какой-либо библиотеки вы можете использовать метод разделения строк следующим образом:

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

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...