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

Обновлено: 21.11.2024

Javadoc

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

Часть расширения файла определяется как строка, следующая за последней точкой ("".") в последнем сегменте. Если в последнем сегменте нет точки, путь не имеет части расширения файла. Если последний сегмент заканчивается точкой, часть расширения файла представляет собой пустую строку.

Популярные методы IPath

Возвращает строковое представление этого пути, включая идентификатор устройства. Тот же разделитель "/" - это u

Возвращает строковое представление этого пути, в котором используется определение разделителя пути, зависящее от платформы

Возвращает канонизированный путь, полученный в результате объединения сегментов заданного пути в e

Возвращает количество сегментов на этом пути. Обратите внимание, что и корневой, и пустой пути содержат 0 сегментов.

Возвращает копию этого пути с указанным количеством сегментов, удаленных с конца. Идентификатор устройства

Возвращает последний сегмент этого пути или null, если сегментов нет.

Возвращает копию этого пути с заданным количеством сегментов, удаленных из начала. Устройство

Возвращает указанный сегмент этого пути или null, если путь не содержит такого сегмента.

Возвращает значение, равное ли этот путь заданному объекту. Равенство для путей определяется как: та же последовательность

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

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

Популярно в Java

Возвратите исходное имя файла в файловой системе клиента. Оно может содержать информацию о пути в зависимости

Это исключение возникает, когда программа пытается создать URL-адрес из неверной спецификации.

Исключение, указывающее на сбой операции JDBC. Он предоставляет следующую информацию о pro

Реентерабельная блокировка взаимного исключения с тем же базовым поведением и семантикой, что и неявный монитор

Этот класс предоставляет доступ к реализациям криптографических шифров для шифрования и дешифрования

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

Никогда не знаешь, когда появится новая платформа, в которой расширения будут разделены запятой. Теперь вам нужно написать зависящий от платформы код. Платформы Java должны быть более дальновидными и иметь API для получения расширений, где они пишут код, зависящий от платформы, а вы, как пользователь API, просто говорите, получите расширение.

@EricDuminil "Обязательно не применяйте методы, которые возвращают "txt" из "filename.txt"" . Попробуйте path.substring(path.lastIndexOf(".")); . И да.. Они точно ничего не дублируют просто так.

@VelocityPulse Это именно меня беспокоит. Поскольку не существует стандартного способа получить расширение файла, вы получаете десятки полунеправильных ответов и несколько отличающихся реализаций. В вашем коде используются 2 метода (мне бы хотелось иметь один единственный явный метод), он возвращает ".txt" из "filename.txt" , что может быть нежелательным результатом, и худшим из все, он завершается с ошибкой StringIndexOutOfBoundsException вместо того, чтобы возвращать пустую строку, если нет расширения.

31 Ответ 31

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

Gradle Groovy DSL

Gradle Kotlin DSL

@zhelon .gz означает сжатый файл gnu, а .tar означает (t)ape (ar)chive. Таким образом, .tar.gz — это tar-файл внутри сжатого gnu файла с расширением .gz.

@guru_001 Нет, конечно, это не так, я просто упомянул, что вы можете вызывать его как с полным путем, так и просто с именем файла.

Действительно ли для этого нужен «парсер»?

Предположим, что вы имеете дело с простыми именами файлов в стиле Windows, а не с архивом.tar.gz .

Кстати, в случае, если у каталога может быть '.', а у самого имени файла нет (например, /path/to.a/file ), вы можете сделать

Как вы сказали, есть ряд вещей, о которых стоит подумать, помимо простого использования наивного lastIndexOf("."). Я предполагаю, что у Apache Commons есть для этого метод, учитывающий все маленькие каверзные потенциальные проблемы.

независимо от того, насколько простым является любой фрагмент кода. вам все еще нужно обновить его/поддерживать/протестировать/сделать доступным как удобную зависимость. гораздо проще, если бы все это уже делала библиотека

Следует отметить, что это возвращает '.' также, поэтому расширение вашего файла будет «.txt», а не «txt» в некоторых других ответах

Лучший ответ и @NickEntin Лучший комментарий. Чтобы удалить точку "." из расширения файла можно закодировать как int lastIndexOf = name.lastIndexOf(".") + 1;

@Iman Akbari: getName() возвращает только само имя файла, которое в вашем примере будет "httpconf".

Если вы используете библиотеку Guava, вы можете прибегнуть к служебному классу Files. У него есть специальный метод getFileExtension(). Например:

Кроме того, вы также можете получить имя файла с помощью аналогичной функции getNameWithoutExtension():

Правда? Это отличная библиотека, полная утилит. Большинство из них станут частью Java8, как и замечательная функция Guava.

К сожалению, не все люди могут решить, какие библиотеки использовать. По крайней мере, у нас есть Apache Commons, пусть и старый.

если вы видите исходный код getFileExtension, на самом деле это просто int dotIndex = fileName.lastIndexOf('.'); вернуть (dotIndex == -1)? "" : fileName.substring(dotIndex + 1) так что ничего страшного. также обратите внимание, что файлы по какой-то причине помечены как «нестабильные».

@Al-Mothafar многие классы помечены как нестабильные (см. сборщики мультикарт), я тоже не понимаю почему: выпущено несколько релизов, но там ничего не изменилось.

Если на Android, вы можете использовать это:

Это проверенный метод

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

если вам нужен только "txt", сделайте path.lastIndexOf(".") + 1

Если вы используете фреймворк Spring в своем проекте, вы можете использовать StringUtils

Мое грязное и, возможно, самое маленькое использование String.replaceAll:

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

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

Как видно из всех других ответов, адекватной «встроенной» функции не существует. Это безопасный и простой метод.

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

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

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

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

Если вы планируете использовать Apache commons-io и просто хотите проверить расширение файла, а затем выполнить какую-либо операцию, вы можете использовать это, вот фрагмент кода:

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

который является типом MIME.

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

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

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

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

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

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

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

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

Как насчет версии REGEX:

или с нулевым расширением:

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

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

Здесь я сделал небольшой метод (правда, не такой безопасный и не проверяет много ошибок), но если только вы программируете общую java-программу, этого более чем достаточно, чтобы найти тип файла. Это не работает со сложными типами файлов, но обычно они не так часто используются.

(1) Вы должны использовать lastIndexOf, чтобы имена файлов, такие как john.smith.report.doc, обрабатывались правильно. (2) Вы должны правильно обрабатывать случаи, когда нет расширения. Этот метод возвращает ABC/XYZ для пути типа abc/xyz, что не имеет никакого смысла. Было бы разумнее вернуть "" или null . (3) Разделитель файлов не всегда / .

Получение расширения файла из имени файла

* Вывод будет одинаковым независимо от машины, на которой выполняется код. * * @param filename имя файла, для которого необходимо получить расширение. * @вернуть расширение файла или пустую строку, если таковой не существует. */ public static String getExtension(String filename) < if (filename == null) < return null; >int index = indexOfExtension(имя файла); если (индекс == -1) < вернуть ""; >else < return filename.substring(index + 1); >> /** * Возвращает индекс последнего символа-разделителя расширения, который является точкой. *

* Этот метод также проверяет отсутствие разделителя каталогов после последней точки. * Для этого он использует, который будет * обрабатывать файл в формате Unix или Windows. *

* Вывод будет одинаковым независимо от машины, на которой выполняется код. * * @param filename имя файла, в котором нужно найти последний разделитель пути, null возвращает -1 * @return индекс последнего символа-разделителя или -1, если * такого символа нет */ public static int indexOfExtension(String filename) < если (имя файла == ноль) < вернуть -1; >int extensionPos = имя файла.lastIndexOf(EXTENSION_SEPARATOR); int lastSeparator = indexOfLastSeparator(имя файла); return (lastSeparator > extensionPos ? -1 : extensionPos); > /** * Возвращает индекс последнего символа-разделителя каталогов. *

* Этот метод работает с файлами в формате Unix или Windows. * Возвращается позиция последней прямой или обратной косой черты. *

Поскольку java.io.File не предоставляет никакого прямого метода для получения расширения файла. Это используется, когда вы хотите обрабатывать файл по-разному на основе его расширения. Я работал над проектом, в котором мне требовался этот служебный метод.

Оглавление

Использование простой программы обработки строк

Создайте простой класс Java с именем GetExtensionOfFileMain.java

Расширение файла для Country.xlsx — xlsx
Расширение файла для Captial.csv — csv
Расширение файла для src/main/resources —

Использование Apache

Вам необходимо скачать Apcahe io jar и поместить его в путь к классам.
После выполнения вышеуказанных шагов вам просто нужно вызвать FilenameUtils.getExtension(), чтобы получить расширение файла в java.

Когда вы запустите вышеуказанную программу, вы получите следующий вывод:

Расширение файла для Country.xlsx — xlsx
Расширение файла для Captial.csv — csv
Расширение файла для src/main/resources —

Это все, что касается расширения файла java get.

Похожие записи

Преобразовать поток вывода в массив байтов в Java

Как получить текущий рабочий каталог в java

Разница между Scanner и BufferReader в Java

Чтение данных в кодировке UTF-8 в java

Запись данных в кодировке UTF-8 в java

Java читать файл построчно

Пример Java FileWriter

Пример Java FileReader

Java — создать новый файл

Работа с формулами в Excel с использованием Apache POI в java

Как установить стиль в Excel с помощью Apache POI в java

Как писать файлы Excel в Java с помощью Apache POI

Поделиться

Как проверить, существует ли файл в Java

Как загрузить файл с URL-адреса в Java

Автор

Похожие сообщения

Преобразовать поток вывода в массив байтов в Java

Содержание Преобразование OutputStream в байтовый массив в JavaПреобразование OutputStream в байтовый буфер в Java В этом посте мы увидим, как преобразовать OutputStream в байтовый массив в Java. Преобразование массива OutputStream в массив байтов в Java Вот шаги для преобразования массива OutputStream в байты в java. Создать экземпляр ByteArrayOutputStream baos Записать данные в […]

Как получить текущий рабочий каталог в java

Узнайте, как получить текущий рабочий каталог в Java разными способами

Разница между Scanner и BufferReader в Java

СодержаниеВведениеScannerBufferedReaderРазница между Scanner и BufferedReader В этом посте мы увидим разницу между Scanner и BufferReader в java. В Java есть два класса, которые уже очень давно используются для чтения файлов. Этими двумя классами являются Scanner и BufferedReader. В этом посте мы найдем основные различия и сходства […]

Чтение данных в кодировке UTF-8 в java

СодержаниеИспользование метода newBufferedReader() в FilesИспользование BufferedReaderИспользование метода readUTF() в DataInputStream В этом посте мы увидим, как читать данные в кодировке UTF-8. Иногда нам приходится иметь дело с данными в кодировке UTF-8 в нашем приложении. Это может быть связано с локализацией или обработкой данных, введенных пользователем. Существует несколько способов чтения данных в кодировке UTF-8 […]

Запись данных в кодировке UTF-8 в java

СодержаниеИспользование метода newBufferWriter() в FilesИспользование BufferedWriterИспользование метода writeUTF() в DataOutputStream В этом посте мы увидим, как записывать данные в кодировке UTF-8. Иногда нам приходится иметь дело с данными в кодировке UTF-8 в нашем приложении. Это может быть связано с локализацией или обработкой данных, введенных пользователем. Мы будем использовать предложения на языке хинди, чтобы писать […]

Java читать файл построчно

Содержание Java 8 StreamsИспользование BufferReaderИспользование ScannerИспользование файловИспользование RandomAccessFileИспользование Apache Commons В этом посте мы увидим различные способы чтения файла построчно в java. Иногда нам нужно прочитать файл построчно в строку и обработать его. Вот разные способы чтения файла построчно в java. Java […]

Присоединяйтесь к сообществу DZone и получите все возможности участника.

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

В этом посте демонстрируется несколько подходов к определению типов файлов в Java. Каждый подход кратко описан, проиллюстрирован листингом кода, а затем связан с выводом, который демонстрирует, как различные общие файлы типизируются на основе расширений. Некоторые подходы можно настраивать, но во всех приведенных здесь примерах используются сопоставления «по умолчанию», которые поставляются «из коробки», если не указано иное.

О примерах

Снимки экрана, показанные в этом посте, показывают, как каждый из перечисленных фрагментов кода выполняется с определенными тематическими файлами, созданными для тестирования различных реализаций определения типов файлов в Java. Прежде чем описывать эти подходы и демонстрировать типы, которые обнаруживает каждый подход, я перечисляю тестируемые файлы, их имена и то, чем они являются на самом деле.

< /tr>
Файл
Имя
Файл
Расширение
Файл
Тип
Соответствие типов
Соглашение о расширении?
actualXml.xmlxmlXML Да
blogPostPDFPDFНет
blogPost .pdfpdfPDFДа
blogPost.jpg gifGIFДа
blogPost.jpgjpgJPEG Да
blogPost.jpgpngPNGДа< /td>
blogPostPDF.txttxtPDFНет
blogPostPDF.xmlxmlPDFНет
blogPostPNG.jpggifPNGНет
blogPostPNG.jpgjpgPNGНет
dustin.txttxtТекст Да
dustin.xmlxmlТекстНет
пыльТекстНет

Files.probeContentType(Path) [JDK 7]

В Java SE 7 появился весьма практичный класс Files, и Javadoc этого класса кратко описывает его использование: «Этот класс состоит исключительно из статических методов, которые работают с файлами, каталогами или другими типами файлов» и, «в большинстве случаев, Определенные здесь методы будут делегировать выполнение файловых операций соответствующему провайдеру файловой системы."

Класс java.nio.file.Files предоставляет метод probeContentType(Path), который «испытывает тип содержимого файла» с помощью «установленных реализаций FileTypeDetector» (в Javadoc также отмечается, что «данный вызов Виртуальная машина Java поддерживает общесистемный список детекторов типов файлов").

Когда описанный выше подход на основе Files.probeContentType(Path) выполняется для ранее определенного набора файлов, выходные данные выглядят так, как показано на следующем снимке экрана.

Снимок экрана показывает, что поведение по умолчанию для Files.probeContentType(Path) на моей JVM тесно связано с расширением файла. Файлы без расширений показывают «null» для типа файла, а другие перечисленные типы файлов соответствуют расширениям файлов, а не их фактическому содержимому. Например, все три файла с именами, начинающимися с «dustin», на самом деле являются одним и тем же текстовым файлом, состоящим из одного предложения, но Files.probeContentType(Path) указывает, что каждый из них имеет разный тип, а перечисленные типы тесно связаны с разными расширениями файлов. практически для одного и того же текстового файла.

MimetypesFileTypeMap.getContentType(String) [JDK 6]

Класс MimetypesFileTypeMap был введен в Java SE 6 для обеспечения «типизации данных файлов через их расширение файла» с использованием «формата .mime.types». Javadoc класса объясняет, где в данной системе класс ищет записи файла типов MIME. В моем примере используются те, которые поставляются из коробки с моей установкой JDK 8. Следующий листинг кода демонстрирует использование javax.activation.MimetypesFileTypeMap .

На следующем снимке экрана показаны результаты выполнения этого примера для набора тестовых файлов.

Эти выходные данные показывают, что подход MimetypesFileTypeMap возвращает MIME-тип приложения/потока октетов для нескольких файлов, включая файлы XML и текстовые файлы без суффикса .txt. Мы также видим, что, как и в предыдущем подходе, этот подход в некоторых случаях использует расширение файла для определения типа файла и, таким образом, неправильно сообщает фактический тип файла, когда этот тип отличается от того, что обычно подразумевает его расширение.

URLConnection.getContentType()

Я расскажу о трех методах URLConnection, поддерживающих определение типа файла. Первый isURLConnection.getContentType(), метод, который «возвращает значение поля заголовка типа контента». Использование этого метода экземпляра продемонстрировано в следующем листинге кода, а результат выполнения этого кода с общими тестовыми файлами показан после листинга кода.

Подход к обнаружению файлов с использованием URLConnection.getContentType() тесно связан с расширениями файлов, а не с фактическим типом файла. При отсутствии расширения возвращается строка «content/unknown».

URLConnection.guessContentTypeFromName(String)

Второй подход к обнаружению файлов, предоставляемый URLConnection, который я расскажу здесь, — это его методguessContentTypeFromName(String). Использование этого статического метода показано в следующем листинге кода и соответствующем снимке экрана вывода.

Подход URLConnection к обнаружению файлов с помощьюgueContentTypeFromName(String) показывает "null" для файлов без расширений файлов и в противном случае возвращает строковые представления типа файла, которые точно отражают расширения файлов. Эти результаты очень похожи на результаты, полученные с помощью подхода Files.probeContentType(Path), показанного ранее, с одним заметным отличием, заключающимся в том, что подход URLConnectionguegueContentTypeFromName(String) идентифицирует файлы с расширением .xml как файлы типа «application/xml». в то время как Files.probeContentType(Path) определяет эти же типы файлов как "text/xml".

URLConnection.guessContentTypeFromStream(InputStream)

Третий подход, который я рассматриваю, который предоставляется URLConnection для определения типа файла, заключается в использовании статического метода класса guessContentTypeFromStream(InputStream). Далее показан листинг кода, использующий этот подход, и связанный с ним вывод на снимке экрана.

Все типы файлов пусты! Причина этого, по-видимому, объясняется в Javadoc для параметра InputStream метода URLConnection.guessContentTypeFromStream(InputStream): «входной поток, который поддерживает метки». Оказывается, экземпляры FileInputStream в моих примерах не поддерживают метки (все их вызовы markSupported() возвращают false ).

Апач Тика

Все примеры обнаружения файлов, описанные в этом посте, были подходами, предоставляемыми JDK. Существуют сторонние библиотеки, которые также можно использовать для определения типов файлов в Java. Одним из примеров является Apache Tika, «набор инструментов для анализа контента», который «обнаруживает и извлекает метаданные и текст из более чем тысячи различных типов файлов». В этом посте я рассмотрю использование класса фасада Tika и его метода обнаружения (String) для определения типов файлов. Вызов метода экземпляра одинаков в трех примерах, которые я показываю, но результаты разные, потому что каждый экземпляр класса фасада Tika создается с помощью другого детектора.

Экземпляры экземпляров Tika с разными Detector показаны в следующем листинге кода.

С этими тремя экземплярами Tika, созданными с соответствующими детекторами, мы можем вызвать метод обнаружения (String) для каждого экземпляра для набора тестовых файлов. Код для этого показан далее.

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

Из вывода видно, что детектор Tika по умолчанию сообщает о типах файлов аналогично некоторым другим подходам, показанным ранее в этом посте (очень тесно привязанным к расширению файла). Два других продемонстрированных детектора в большинстве случаев указывают тип файла application/octet-stream. Поскольку я назвал перегруженную версию метода detect(-), которая принимает строку, определение типа файла «основано на известных расширениях имени файла».

Если вместо метода detect(String) используется перегруженный метод detect(File), результаты для идентифицированного типа файла будут намного лучше, чем в предыдущих примерах Tika и предыдущих примерах JDK. На самом деле, «поддельные» расширения не так сильно обманывают детекторы, а детектор Tika по умолчанию особенно хорош в моих примерах при определении соответствующего типа файла, даже если расширение не является обычным, связанным с этим типом файла. Код для использования Tika.Обнаружить(Файл) и связанный с ним вывод показаны далее.

Предупреждения и персонализация

Определение типа файла – непростая задача. Подходы Java к обнаружению файлов, продемонстрированные в этом посте, предоставляют базовые подходы к обнаружению файлов, которые часто сильно зависят от расширения имени файла. Если файлы имеют имена с обычными расширениями, которые распознаются методом обнаружения файлов, этих подходов обычно достаточно. Однако, если используются нетрадиционные расширения типов файлов или расширения предназначены для файлов с типами, отличными от тех, которые обычно связаны с этим расширением, большинство этих подходов к обнаружению файлов не работают без настройки. К счастью, большинство этих подходов позволяют настраивать сопоставление расширений файлов с типами файлов. Подход Tika с использованием Tika.detect(File), как правило, был наиболее точным в примерах, показанных в этом посте, когда расширения не были обычными для определенных типов файлов.

Заключение

В Java существует множество механизмов для простого определения типа файла. В этом посте были рассмотрены некоторые стандартные подходы JDK к обнаружению файлов и несколько примеров использования Tika для обнаружения файлов.

Читайте также: