Просто чтобы прояснить, я не ищу тип MIME.
Допустим, у меня есть следующий вход: /path/to/file/foo.txt
Я хотел бы способ разбить этот вход, в частности, .txt
для расширения. Есть ли способ сделать это в Java? Я хотел бы избежать написания моего собственного парсера.
"txt"
из ,"filename.txt"
потому что некоторые платформы где - то , возможно , захотите использовать"filename,txt"
.path.substring(path.lastIndexOf("."));
..... И да .. Они точно не будут ничего дублировать ...".txt"
из"filename.txt"
, который не может быть желаемым результатом, и хуже всего, он терпит неудачу сStringIndexOutOfBoundsException
вместо того , чтобы возвратить пустую строку , если нет расширения.Ответы:
В этом случае используйте FilenameUtils.getExtension от Apache Commons IO
Вот пример того, как его использовать (вы можете указать либо полный путь, либо просто имя файла):
Maven зависимость:
Gradle Groovy DSL
Gradle Kotlin DSL
Другие https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
источник
Вам действительно нужен "парсер" для этого?
Предполагая, что вы имеете дело с простыми Windows-подобными именами файлов, а не с чем-то вроде
archive.tar.gz
.Кстати, для случая, когда каталог может иметь «.», Но само имя файла не (как
/path/to.a/file
), вы можете сделатьисточник
i > 0
следует изменить наi >= 0
илиi != -1
. Это заботится о именах файлов, как.htaccess
.источник
Если вы используете библиотеку Guava , вы можете прибегнуть к
Files
служебному классу. У него есть определенный методgetFileExtension()
. Например:Кроме того, вы также можете получить имя файла с помощью аналогичной функции getNameWithoutExtension () :
источник
getFileExtension
самом деле, это неint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
так уж сложно. также обратите внимание, чтоFiles
помечен как «нестабильный» по некоторым причинам.Если на Android, вы можете использовать это:
источник
Чтобы учесть имена файлов без символов перед точкой, вы должны использовать это небольшое изменение принятого ответа:
источник
Это проверенный метод
И контрольный пример:
источник
Мой грязный и может крошечный, используя String.replaceAll :
Обратите внимание, что сначала
*
он жадный, поэтому он будет захватывать максимально возможное количество символов, а затем останется только последняя точка и расширение файла.источник
.replaceAll(".*\\.", "")
вернуть ".txt"
если вы хотите только "TXT", сделайте
path.lastIndexOf(".") + 1
источник
Как видно из всех других ответов, нет адекватной «встроенной» функции. Это безопасный и простой метод.
источник
Как насчет (с использованием Java 1.5 RegEx):
источник
Если вы планируете использовать Apache commons-io и просто хотите проверить расширение файла, а затем выполнить какую-либо операцию, вы можете использовать это , вот фрагмент:
источник
Вот еще один вкладыш для Java 8.
Это работает следующим образом:
источник
Как насчет JFileChooser? Это не просто, так как вам нужно будет проанализировать его окончательный результат ...
который является типом MIME ...
Хорошо ... я забыл, что вы не хотите знать его MIME-тип.
Интересный код по следующей ссылке: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html
Связанный вопрос: Как мне урезать расширение файла из строки в Java?
источник
Вот метод, который обрабатывает
.tar.gz
правильно, даже в пути с точками в именах каталогов:afterLastSlash
Создан дляafterLastBackslash
ускорения поиска, так как ему не придется искать всю строку, если в ней есть какие-то косые черты.char[]
В оригиналеString
используется повторно, не добавляя мусор там, и виртуальная машина, вероятно , заметили , чтоafterLastSlash
сразу же мусор для того , чтобы поместить его в стек вместо кучи .источник
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-программу, этого более чем достаточно, чтобы найти тип файла. Это не работает для сложных типов файлов, но они обычно используются не так часто.
источник
lastIndexOf
так, чтобы имена файлов вродеjohn.smith.report.doc
обрабатывались правильно. (2) Вы должны правильно обрабатывать случаи, когда нет расширения. Этот метод возвращаетABC/XYZ
путь вродеabc/xyz
, который не имеет никакого смысла. Было бы больше смысла вернуться""
илиnull
. (3) Разделитель файлов не всегда/
.Получение расширения файла из имени файла
кредиты
источник
Без использования какой-либо библиотеки вы можете использовать метод String split следующим образом:
источник
Просто альтернатива на основе регулярных выражений. Не так быстро, не так хорошо.
источник
Я нашел лучший способ найти расширение, смешав все ответы выше
источник
Мне нравится простота ответа Spectre , и в одном из его комментариев есть ссылка на другой ответ, который фиксирует точки в путях к файлам, на другой вопрос, заданный EboMike .
Без реализации какого-либо стороннего API, я предлагаю:
Нечто подобное может быть полезно, скажем, в любом из
write
методов ImageIO , где необходимо передать формат файла.Зачем использовать весь сторонний API, когда вы можете сделать DIY?
источник
Этот конкретный вопрос доставил мне много хлопот, тогда я нашел очень простое решение этой проблемы, которое я публикую здесь.
Вот и все.
источник
попробуй это.
источник
источник
Java имеет встроенный способ решения этой проблемы в классе java.nio.file.Files , который может работать для ваших нужд:
Обратите внимание, что этот статический метод использует найденные здесь спецификации для получения «типа контента», который может варьироваться.
источник