2015-10-12 2 views
0

Что такое надежный способ получить расширение файла на Java?Надежный способ получить расширение файла

Я не говорю о выполнении substring/lastIndexOf. на File.getName(), потому что он бесполезен на сложных расширений, таких как .tar.gz и так далее. (Это то, что все библиотеки там (Commons IO, Guava и т. Д.), Кажется, делают. Я ищу более сложный/надежный способ сделать это, который возвращает реальное расширение.

Хотя это звучит как дубликат многих других вопросов здесь, это не то же самое. другие плакаты были счастливы с простым ответом, который делает lastIndexOf.. Это нарушает случаи, когда расширение сделано из более чем одной точки.

ISN» t есть просто метод, который может быть использован для его возврата?

Полезные советы будут приниматься во внимание.

+1

С технической точки зрения '.tar.gz' является'.gz' .tar'. –

+7

Пожалуйста, определите «реальное расширение». – biziclop

+2

Возможный дубликат [Получение типа Mime типа в Java] (http://stackoverflow.com/questions/51438/getting-a-files-mime-type-in-java) – Tunaki

ответ

5

Что такое надежный способ получить расширение файла на Java?

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

Или, говоря иначе, «реальное» расширение - это конструкция, которая помещает имя файла читателю. И я думаю, вы обнаружите, что разные люди размещают разные конструкции. (Действительное расширение для «foo.tar.gz» - это «gz» или «tar.gz», в зависимости от вашей точки зрения ... и то, что приложение предназначено для выполнения.)

Лучший из вас может сделать это, чтобы закодировать ваше приложение, чтобы использовать либо «материал после первой точки», либо «материал после последней точки» в качестве суффикса, в зависимости от того, что ему нужно. (А может быть, немного фильтрации отличить ожидаемых расширений из материала, что приложение не понимает.)


Тогда есть проблема, что расширение файла (однако вы извлечь его) не является надежным индикатором формата файла. Вы можете попытаться определить формат, используя что-то вроде Apache Tika. Однако даже это может быть проблематичным, если формат не распознан или (что еще хуже), если для данного файла существует несколько возможных форматов.


Возвращаясь к foo.tar.gz примеру, насколько мне известно, единственная программа, которая опирается на расширение файла является gunzip команда, которая будет распаковывать foo.tar.gz в foo.tar. tar сама команда является агностиком расширение файла:

  • Он будет читать любой файл в формате TAR, независимо от расширения.
  • Если файл TAR сжимается (с использованием сжатия gzip), вам необходимо указать -z или --gzip или эквивалентную опцию, независимо от расширения.

Большинство программ UNIX/Linux аналогичным образом не зависят от расширений файлов.

Смежные вопросы