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

Обновлено: 07.07.2024

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

ОТВЕТЫ

Ответ 1

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

Gradle Groovy DSL

Gradle Kotlin DSL

Ответ 2

Вам действительно нужен "парсер" для этого?

Предполагая, что вы имеете дело с простыми именами файлов в Windows, а не с текстом archive.tar.gz .

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

Ответ 3

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

И тестовый пример:

Ответ 8

Моя грязная и может мельчайше всего использовать String.replaceAll:

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

Ответ 9

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

Вот еще один вкладыш для Java 8.

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

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

Ответ 16

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

Ответ 17

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

или с поддержкой нулевого расширения:

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

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

Ответ 18

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

Ответ 19

Ответ 20

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

Ответ 21

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

Кредиты

Ответ 22

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

Ответ 23

Просто альтернатива на основе регулярных выражений. Не так быстро, не так хорошо.

Ответ 24

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

Ответ 25

Я нашел лучший способ найти расширение, смешав все вышеперечисленные ответы

Ответ 26

Мне нравится простота ответа призрака, и в одном из его комментариев есть ссылка на другой ответ, который исправляет точки в путях к файлам, на другой вопрос, заданный EboMike.

Без реализации какого-либо стороннего API, я предлагаю:

Нечто подобное может быть полезно, скажем, в любом из методов write ImageIO, где необходимо передать формат файла.

Зачем использовать весь сторонний API, когда вы можете сделать DIY?

Ответ 27

Вы можете использовать функцию Java7 из пакета java.io

Обратитесь к приведенному ниже фрагменту кода

Ответ 28

Ответ 29

Ответ 30

Java имеет встроенный способ борьбы с этим, в java.nio.file.Files классе, который может работать для вашего необходимо:

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

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

в этом случае использовать FilenameUtils.getExtension С Apache Commons IO

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

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

предполагая, что вы имеете дело с простыми именами файлов Windows, а не с чем-то вроде archive.tar.gz .

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

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

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

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

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

мой грязный и может мельчайший с помощью строку.заменяет:

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

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

и тестовый пример:

Как насчет (С помощью Java 1.5 RegEx):

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

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

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

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

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

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

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

31 ответ

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

Следует отметить, что он возвращает только «gz» для файла с именем archive.tar.gz. @BrainSlugs83 BrainSlugs83 Так что же означает «смола»? @zhelon .gz расшифровывается как сжатый файл gnu, а .tar обозначает (t) ape (ar) зубок чеснока. Итак, .tar.gz - это tar-файл внутри zn-файла gnu с расширением .gz. @guru_001 guru_001 Нет, конечно, это просто упоминание того, что вы можете называть его как с полным путем, так и с именем файла. @JuanRojas Я загружаю и добавляю apache-commons-io 2.5, но FilenamUtils не найден в Intellij. @Zitrax не может иметь более одного расширения для имени файла или расширения, содержащего точку, поэтому в вашем случае расширение .gz Для этой простой задачи нет причин использовать другую библиотеку.

Вам действительно нужен "парсер" для этого?

Предполагая, что вы имеете дело с простыми именами файлов в Windows, а не с текстом archive.tar.gz .

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

Как вы говорите, есть несколько вещей, о которых нужно подумать, помимо простого использования наивного lastIndexOf ("."). Я предполагаю, что у Apache Commons есть метод для этого, который учитывает все маленькие хитрые потенциальные проблемы. Я думаю, что i > 0 следует изменить на i >= 0 или i != -1 . Это заботится о именах файлов, таких как .htaccess . Это решение не будет работать, если расширение файла содержит обратную косую черту. независимо от того, насколько прост любой фрагмент кода . вам все равно нужно обновить его / поддерживать его / протестировать / сделать его доступным в качестве удобной зависимости . намного проще, если все это уже выполнялась библиотекой lib Еще одна проблема, если файл заканчивается точкой. Лучше в библиотеке. if (i> p && i <(fileName.length () - 1)) Если вы используете библиотеку Guava, вы можете обратиться к Files служебному классу. Он имеет конкретный метод, getFileExtension() . Например:

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

В самом деле? Это отличная библиотека, полная утилит. Большинство из них будут частью Java8, как и большая функция Guava. К сожалению, не все люди могут решить, какие библиотеки использовать. По крайней мере, у нас есть Apache Commons, хотя и старый. @Al-Mothafar Al-Mothafar, многие классы помечены как нестабильные (см. Многокартовые компоновщики), я также не понимаю, почему: выпущено несколько выпущенных версий, но там ничего не изменилось.

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

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

Моя грязная и может мельчайше всего использовать String.replaceAll:

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

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

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

И тестовый пример:

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

Обратите внимание, что эта проверка чувствительна к регистру в соответствии с документами.

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

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

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

этот метод скопирован из исходного кода Guava, вы должны упомянуть об этом. Я не копировал это. Если это в исходном коде Guava, они скопировали его отсюда. Возможно уведомить их. извините за то, что это не идентично между прочим, так что, может, у вас и разработчика Guava просто одна и та же идея.

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

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

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

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

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

или с поддержкой нулевого расширения:

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

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

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

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

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

Кредиты

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

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

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

Вот еще один вкладыш для Java 8.

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

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

Мне нравится простота ответа призрака, и в одном из его комментариев есть ссылка на другой ответ, который исправляет точки в путях к файлам, на другой вопрос, заданный EboMike.

Без реализации какого-либо стороннего API, я предлагаю:

Нечто подобное может быть полезно, скажем, в любом из методов write ImageIO, где необходимо передать формат файла.

Зачем использовать весь сторонний API, когда вы можете сделать DIY?

Я нашел лучший способ найти расширение, смешав все вышеперечисленные ответы

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

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

Вы никогда не знаете, когда появится какая-то новая платформа, которая определяет расширения как разделенные запятой. Теперь вам нужно написать зависимый от платформы код. Фреймворки Java должны быть более дальновидными и иметь API для получения расширений, где они пишут зависимый от платформы код, а вы, как пользователь API, просто скажете, получите расширение. @EricDuminil "Убедитесь, что не реализован какой-либо метод, который возвращает" txt "из" filename.txt "" . Попробуй path.substring(path.lastIndexOf(".")); . И да .. Они точно не будут ничего дублировать .

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

Gradle Groovy DSL

Gradle Kotlin DSL

Следует отметить, что он возвращает только «gz» для файла с именем archive.tar.gz. @zhelon .gz расшифровывается как сжатый файл gnu, а .tar обозначает (t) ape (ar) зубок чеснока. Итак, .tar.gz - это tar-файл внутри zn-файла gnu с расширением .gz. Для этой простой задачи нет причин использовать другую библиотеку.

Вам действительно нужен "парсер" для этого?

Предполагая, что вы имеете дело с простыми Windows-подобными именами файлов, а не с чем-то вроде archive.tar.gz .

Кстати, для случая, когда каталог может иметь «.», Но само имя файла не (как /path/to.a/file ), вы можете сделать

Как вы говорите, есть несколько вещей, о которых нужно подумать, помимо простого использования наивного lastIndexOf ("."). Я предполагаю, что у Apache Commons есть метод для этого, который учитывает все маленькие хитрые потенциальные проблемы. Я думаю, что i > 0 следует изменить на i >= 0 или i != -1 . Это заботится о именах файлов, как .htaccess . независимо от того, насколько прост любой фрагмент кода . вам все равно нужно обновить его / поддерживать его / протестировать / сделать его доступным в качестве удобной зависимости . гораздо проще, если бы все это уже выполнялось библиотекой Еще одна проблема, если файл заканчивается точкой. Лучше в библиотеке. if (i> p && i <(fileName.length () - 1)) Если вы используете библиотеку Guava , вы можете прибегнуть к Files служебному классу. У него есть определенный метод getFileExtension() . Например:

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

В самом деле? Это отличная библиотека, полная утилит. Большинство из них будут частью Java8, как и большая функция Guava . К сожалению, не все люди могут решить, какие библиотеки использовать. По крайней мере, у нас есть Apache Commons, хотя и старый. если вы видите исходный код на getFileExtension самом деле, это не int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1) так уж сложно. также обратите внимание, что Files помечен как «нестабильный» по некоторым причинам. @ Аль-Мотафар, многие классы помечены как нестабильные (см. Многокартовые компоновщики), я также не понимаю, почему: выпущено несколько выпущенных версий, но там ничего не изменилось.

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

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

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

И контрольный пример:

Мой грязный и может крошечный, используя String.replaceAll :

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

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

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

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

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

Обратите внимание, что эта проверка чувствительна к регистру в соответствии с документами.

Вот еще один вкладыш для Java 8.

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

  1. Разбейте строку на массив строк, используя «.»
  2. Конвертировать массив в поток
  3. Используйте Reduce, чтобы получить последний элемент потока, то есть расширение файла.

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

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

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

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

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

этот метод скопирован из исходного кода Guava, вы должны упомянуть об этом. Я не копировал это. Если это в исходном коде Guava, они скопировали его отсюда. Возможно уведомить их. извините за то, что это не идентично между прочим, так что, может, у вас и разработчика Guava просто одна и та же идея. Действительно "gz" - правильное расширение для возврата. Если вызывающий код также может обрабатывать «tar», он должен дополнительно проверить внешнюю по отношению к getExtension функции. Если имя файла пользователя, "my zip. don't touch.tar.gz" то этот метод вернет неправильное расширение.

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

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

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

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

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

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

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

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

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

кредиты

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

Просто альтернатива на основе регулярных выражений. Не так быстро, не так хорошо.

Я нашел лучший способ найти расширение, смешав все ответы выше

Мне нравится простота ответа Spectre , и в одном из его комментариев есть ссылка на другой ответ, который фиксирует точки в путях к файлам, на другой вопрос, заданный EboMike .

Без реализации какого-либо стороннего API, я предлагаю:

Нечто подобное может быть полезно, скажем, в любом из write методов ImageIO , где необходимо передать формат файла.

Зачем использовать весь сторонний API, когда вы можете сделать DIY?

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

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