Java имя файла без расширения
Программно определить тип файла может быть удивительно сложно, и было предложено и реализовано много подходов идентификации файлов на основе контента . Существует несколько реализаций, доступных в Java для обнаружения типов файлов, и большинство из них в значительной степени или исключительно основаны на расширениях файлов. В этом посте рассматриваются некоторые из наиболее распространенных реализаций обнаружения типов файлов в Java.
В этом посте демонстрируется несколько подходов к идентификации типов файлов в Java. Каждый подход кратко описан, проиллюстрирован листингом кода, а затем связан с выводом, который демонстрирует, как различные общие файлы печатаются на основе расширений. Некоторые из подходов являются настраиваемыми, но все показанные здесь примеры используют сопоставления «по умолчанию», как это предусмотрено «из коробки», если не указано иное.
О примерах
Снимки экрана, показанные в этом посте, представляют собой каждый из перечисленных фрагментов кода, запускаемых для определенных тематических файлов, созданных для тестирования различных реализаций обнаружения типов файлов в Java. Прежде чем рассказать об этих подходах и продемонстрировать тип, который обнаруживает каждый из них, я перечисляю тестируемые файлы, их имена и имена.
файл название | файл расширение | файл Тип | Тип совпадений Конвенция о продлении? |
---|---|---|---|
actualXml.xml | XML | XML | да |
blogPostPDF | нет | ||
blogPost.pdf | да | ||
blogPost.jpg | GIF | GIF | да |
blogPost.jpg | JPG | JPEG | да |
blogPost.jpg | PNG | PNG | да |
blogPostPDF.txt | текст | нет | |
blogPostPDF.xml | XML | нет | |
blogPostPNG.jpg | GIF | PNG | нет |
blogPostPNG.jpg | JPG | PNG | нет |
dustin.txt | текст | Текст | да |
dustin.xml | XML | Текст | нет |
Дастин | Текст | нет |
Files.probeContentType (Path) [JDK 7]
Java SE 7 представила высоко утилитарный класс Files, и Javadoc этого класса кратко описывает его использование: «Этот класс состоит исключительно из статических методов, которые работают с файлами, каталогами или другими типами файлов» и «в большинстве случаев с методами, определенными здесь делегирует соответствующему провайдеру файловой системы для выполнения файловых операций ».
Может кто-нибудь сказать мне, как получить имя файла без расширения? Пример:
Если вы, как и я, предпочли бы использовать некоторый библиотечный код, в котором они, вероятно, подумали обо всех особых случаях, например, что произойдет, если вы передадите ноль или точки в пути, но не в имени файла, вы можете использовать следующее:
Вы также можете использовать FilenameUtils.getBasename для перехода от строки пути к имени файла без расширения. Для тех, кто предпочитает гуаву, он тоже может это сделать . (В настоящее время я лично не очень Хотя Guava и Commons-IO могут предложить немного больше, вы будете удивлены тем, сколько удобных методов уже включено в JDK 7 с java.nio.file.Files и Path - таких как разрешение базовых каталогов, копирование / перемещение файлов в одну строку, получение только имени файла и т. д. @Lan Durkan в настоящее время FilenameUtils.getBaseName с большой буквы NСамый простой способ - использовать регулярное выражение.
Вышеупомянутое выражение удалит последнюю точку, за которой следует один или несколько символов. Вот базовый юнит-тест.
Regex не так прост в использовании, как приведенное выше решение для библиотеки. Это работает, но смотреть на код (без необходимости интерпретировать REGEX) не очевидно, что он делает. / * следующее регулярное выражение также удаляет путь * / "/the/path/name.extension".replaceAll(".*[\\\\]]\\\[^\\.]*$", "") ; Я бы добавил косые черты ко второму классу персонажей, чтобы быть уверенным, что вас не запутает путь, подобный «/foo/bar.x/baz»Смотрите следующую тестовую программу:
Какое расширение foo.tar.gz ? Я понимаю, почему это .tar.gz было бы то, что вы хотели бы. @tchrist, foo.tar.gz это версия gzip, foo.tar так что вы также можете утверждать, что это gz было расширение. Все сводится к тому, как вы определяете расширение. Как вы знаете, имя класса в Java никогда не должно начинаться с маленькой буквы! Если бы это было правилом, язык обеспечил бы его соблюдение. Поскольку это не так, это руководство, как бы сильно оно ни предлагалось. В любом случае, это совершенно не имеет отношения к вопросу и ответу.Вот порядок консолидированного списка по моим предпочтениям.
Использование Apache Commons
Использование Google Guava (если вы уже используете его)
Или используя Core Java
Liferay API
Если ваш проект использует Guava (14.0 или новее), вы можете пойти с Files.getNameWithoutExtension() .
(По сути, то же самое, что и в FilenameUtils.removeExtension() Apache Commons IO, как следует из ответа, получившего наибольшее количество голосов . Просто хотел бы отметить, что Guava делает то же самое. Лично я не хотел добавлять зависимость к Commons, что, по моему мнению, является чем-то вроде реликта) только из-за этого.)
на самом деле это больше похоже на FilenameUtils.getBaseName() на самом деле guava - такая нестабильная библиотека, что я просто избегаю использовать ее везде, где могу. предпочитаю стабильную реликвию, чем эксперименты Гугеля Хорошая информация, но пользователи должны знать о таких случаях, как ".htaccess", где этот метод будет возвращать "".Если вы скачаете исходный код и взгляните на их класс FilenameUtils, вы увидите, что есть много дополнительных утилит, и они справляются с путями Windows и Unix, что прекрасно.
Однако, если вы просто хотите использовать несколько статических утилит для использования с путями в стиле Unix (с разделителем "/"), вы можете найти приведенный ниже код полезным.
removeExtension Метод сохраняет остальную часть пути вместе с именем файла. Существует также аналогичное getExtension .
Простейший способ получить имя из относительного или полного пути - использовать
Как проще всего получить имя файла без расширения?
Могут быть две ситуации
1. Файл имеет расширение.
2. Файл не имеет расширения.
Как проще всего это обрабатывать?
Здравствуйте, Аноним, Вы писали:
А>Как проще всего получить имя файла без расширения?
А>Могут быть две ситуации
А>1. Файл имеет расширение.
А>2. Файл не имеет расширения.
Расширение это всего лишь условная часть имени файла. Поэтому File.getName и String.lastIndexOf и т.п.
Здравствуйте, <Аноним>, Вы писали:А>Как проще всего получить имя файла без расширения?
А>Могут быть две ситуации
А>1. Файл имеет расширение.
А>2. Файл не имеет расширения.
А>Как проще всего это обрабатывать?
Здравствуйте, Сэма, Вы писали:
С>if (arr.length=1) <
==
С>//Последний элемент нафик все остальное в кучку
Я вот думаю, а зачем вы сплитите строку, создаете массив и потом джойните его обратно, если все делается вообще тривиально?
И главное ведь. Наглядно и просто.
И еще не забыть про ситуацию, когда файл начинается с '.'Здравствуйте, V.Goncharov, Вы писали:
VG>И еще не забыть про ситуацию, когда файл начинается с '.'
Здравствуйте, bolshik, Вы писали:
VG>>И еще не забыть про ситуацию, когда файл начинается с '.'
Расширение вообще имеет смысл чисто нотационный. Если файл имет в нуле точку, то не факт, что он вообще имеет «имя без расширения».
Но можно для этой ситуации сравнивать не как != -1, а как > 0.
B>lastIndexOf() != indexOf()
A>Здравствуйте, bolshik, Вы писали:
VG>>>И еще не забыть про ситуацию, когда файл начинается с '.'
A>Расширение вообще имеет смысл чисто нотационный. Если файл имет в нуле точку, то не факт, что он вообще имеет «имя без расширения».
A>Но можно для этой ситуации сравнивать не как != -1, а как > 0.
B>>lastIndexOf() != indexOf()
A>Это не верно.
Это уже скорее в философию надо идти или в алгоритмы ибо спор вечен и договоренность должна быть:
1) Никто ни разу не сказал про то что это ТОЛЬКО имя файла а не вся домовая книга включая путь
2) Нужна четкая договоренность что то что после последней точки ВСЕГДА являтеся расширением а не очередным.словом.в.ненормальном.имени.файла_без.расширения
Здравствуйте, Сэма, Вы писали:
С>Здравствуйте, aefimov, Вы писали:
A>>Расширение вообще имеет смысл чисто нотационный. Если файл имет в нуле точку, то не факт, что он вообще имеет «имя без расширения».
A>>Но можно для этой ситуации сравнивать не как != -1, а как > 0.
С>Это уже скорее в философию надо идти или в алгоритмы ибо спор вечен и договоренность должна быть:
С>1) Никто ни разу не сказал про то что это ТОЛЬКО имя файла а не вся домовая книга включая путь
С>2) Нужна четкая договоренность что то что после последней точки ВСЕГДА являтеся расширением а не очередным.словом.в.ненормальном.имени.файла_без.расширения
А почему "очередным.словом.в.ненормальном.имени.файла_без.расширения"? Достаточно понимать, что java — это кросплатформенная система, а следовательно предполагать о:
1. Наличии диска С в пути
2. Наличии расширения
3. Регистронезависимости
— категорически не стоит.
Здравствуйте, Сэма, Вы писали:
А>>Как проще всего это обрабатывать?
С>
только split(. ) использует регулярные выражения. так работать не будет.
следовало бы split("\\.")
Оно не тормозит, кстати?
Если вам в IDE надо отрисовать иконки на файлах проекта и разбросать их по типам? А файлов, гдето под 20000?
Здравствуйте, Аноним, Вы писали:
А>Как проще всего получить имя файла без расширения?
А можна узнать зачем такое нужно?
Может Вы просто выбрали не правильное направление в решении вашей задачи?
A>Оно не тормозит, кстати?
A>Если вам в IDE надо отрисовать иконки на файлах проекта и разбросать их по типам? А файлов, гдето под 20000?
Что прям все 20000 в одном tree? , а не правильнее ли lazy tree + cache? Зато никакой привязки. Ибо меня вот например бесит idea тем, что у нее все на расширения подвязано и сделать что-то более умное (например отличать spring xml от просто xml) невозможно.
Здравствуйте, aka50, Вы писали:
A>>Если вам в IDE надо отрисовать иконки на файлах проекта и разбросать их по типам? А файлов, гдето под 20000?
A>Что прям все 20000 в одном tree? , а не правильнее ли lazy tree + cache? Зато никакой привязки. Ибо меня вот например бесит idea тем, что у нее все на расширения подвязано и сделать что-то более умное (например отличать spring xml от просто xml) невозможно.
Ну вобщето возможно. Но без полного парсинга не обойтись же всеравно. А фулскан дерева нужен, чтобы в рефакторингах не пропустить ничего. Ну и в лукапах.
А>А можна узнать зачем такое нужно?А>Может Вы просто выбрали не правильное направление в решении вашей задачи?
Затем что есть несколько файлов с одинаковым именем, но с разными расширениями.
А читать в определенный момент надо только файл с нужным расширением.
Здравствуйте, aefimov, Вы писали:
A>Ну вобщето возможно. Но без полного парсинга не обойтись же всеравно. А фулскан дерева нужен, чтобы в рефакторингах не пропустить ничего. Ну и в лукапах.
Так ведь все равно psi строится. так какая разница тогда какое расширение, ведь существует точное отображение psielement <- file, и выходит что расширение только с толку сбивает. А так все просто, появился новый файл, его отсканили (при чем точно определили тип, не просто .doc, а именно MSOffice 6.0 Document) и сохранили в кеш. А если исходить из просто расширения, то .doc может быть чем угодно (и просто текст, и MSO и вообще что-то невообразимое).
Здравствуйте, aka50, Вы писали:
A>Так ведь все равно psi строится. так какая разница тогда какое расширение, ведь существует точное отображение psielement <- file, и выходит что расширение только с толку сбивает. А так все просто, появился новый файл, его отсканили (при чем точно определили тип, не просто .doc, а именно MSOffice 6.0 Document) и сохранили в кеш. А если исходить из просто расширения, то .doc может быть чем угодно (и просто текст, и MSO и вообще что-то невообразимое).
Хотя с другой стороны, отличить файл допустим .scala от .java достаточно сложно (если не невомзможно), по этому имхо лучший вариант mime + extension.
Здравствуйте, aka50, Вы писали:
A>Так ведь все равно psi строится. так какая разница тогда какое расширение, ведь существует точное отображение psielement <- file, и выходит что расширение только с толку сбивает. А так все просто, появился новый файл, его отсканили (при чем точно определили тип, не просто .doc, а именно MSOffice 6.0 Document) и сохранили в кеш. А если исходить из просто расширения, то .doc может быть чем угодно (и просто текст, и MSO и вообще что-то невообразимое).
Вы предлагаете взять N PSI парсеров ,прогнать через них X файлов и полученное PSI дерево (еще надо выбрать какое их них лучше) сохраняем в кешах и рисуем иконку в зависимости от типа PsiFile?
Оно умрет Надо как то быстро раскидать файлы для парсеров. Т.е. быстро установить соответствие между файлом и его парсером. Сейчас это делает патернами по имени файла. Вероятно делать первых N байт тоже можно, но это может тормозить (открытие файла операция не быстрая).
Здравствуйте, aefimov, Вы писали:A>Здравствуйте, aka50, Вы писали:
A>Вы предлагаете взять N PSI парсеров ,прогнать через них X файлов и полученное PSI дерево (еще надо выбрать какое их них лучше) сохраняем в кешах и рисуем иконку в зависимости от типа PsiFile?
Как-то прям официально , "Вы" .
A>Оно умрет Надо как то быстро раскидать файлы для парсеров. Т.е. быстро установить соответствие между файлом и его парсером. Сейчас это делает патернами по имени файла. Вероятно делать первых N байт тоже можно, но это может тормозить (открытие файла операция не быстрая).
Дык mime — это и есть первые N байт
Но в целом согласен, все таки маска поиска нужна. Другой вопрос, стоит ли затачиваться что это будет именно filename.ext, а не filename.ext.ext2.ext3
Здравствуйте, Аноним, Вы писали:
А>Как проще всего получить имя файла без расширения?
А>Могут быть две ситуации
А>1. Файл имеет расширение.
А>2. Файл не имеет расширения.
А>Как проще всего это обрабатывать?
Ну так мы вроде определились что "расширений" в природе нет
Но!
В прикладной задаче нет ничего проще их заново ввести.
То есть тебе известно, что имя файла имеет вид "имя_незнаю_чего[.расширение]"
Теперь вопрос. Имя_незнаю_чего может содержать точку? Если нет то все банально lastIndexOf и вперед. Иначе нужно больше сведений о том что такое имя_незнаю_чего, какие могут быть расширения, или любую другую инфомацию на эту тему.
Кто-нибудь может сказать мне, как получить имя файла без расширения? Пример:
Я пытаюсь получить имя файла без расширения текущего файла документа в Omnigraffle Professional 5. tell application OmniGraffle Professional 5 set _document to front document set _path to path of _document -- Get filename without extension tell application Finder set
Я хочу получить имя файла изображения без расширения в MATLAB. Я попытался использовать функцию (fileparts )как: [pathstr, name, ext, versn] = fileparts(filename); в этой функции (имя файла) должно быть с полным путем, чтобы получить имя файла без расширения в переменной (имя). когда у меня есть.
Если вы, как и я, предпочитаете использовать какой-то библиотечный код, в котором они, вероятно, продумали все особые случаи, например, что произойдет, если вы передадите null или точки в пути, но не в имени файла, вы можете использовать следующее:
Самый простой способ-использовать регулярное выражение.
Приведенное выше выражение удалит последнюю точку, за которой следует один или несколько символов. Вот базовый модульный тест.
См. Следующую программу тестирования:
Вот порядок сводного списка по моим предпочтениям.
Использование apache commons
Использование Google Guava (если вы уже используете его)
Или с помощью Core Java
Liferay API
Если у меня есть имя файла, подобное одному из этих: 1.1.1.1.1.jpg 1.1.jpg 1.jpg Как я мог получить только имя файла, без расширения? Подойдет ли regex?
Если в вашем проекте используется Guava (14.0 или новее), вы можете использовать Files.getNameWithoutExtension() .
(По сути, то же самое, что и FilenameUtils.removeExtension() из Apache общин IO, как следует из ответа с наибольшим количеством голосов . Просто хотел отметить, что Гуава тоже так делает. Лично я не хотел добавлять зависимость к общему достоянию—что, по моему мнению, является чем—то вроде пережитка-только из-за этого.)
Если вы загрузите исходный код и посмотрите на их класс FilenameUtils, вы увидите, что есть много дополнительных утилит, и он справляется с путями Windows и Unix, что очень мило.
Однако, если вам просто нужна пара статических служебных методов для использования с путями стиля Unix (с разделителем"/"), вы можете найти приведенный ниже код полезным.
Метод removeExtension сохраняет rest пути вместе с именем файла. Существует также аналогичный getExtension .
Самый простой способ получить имя из относительного пути или полного пути-это использовать
Вы можете использовать функцию java split для разделения имени файла от расширения, если вы уверены, что в имени файла есть только одна точка для расширения.
File filename = new File('test.txt'); File.getName().split("[.]");
таким образом, split[0] вернет "test", а split[1] вернет "txt"
String fileName = FilenameUtils.getBaseName("test.xml");
Используйте FilenameUtils.removeExtension из Apache Commons IO
Вы можете указать полный путь или только имя файла .
Надеюсь, это поможет ..
Сохраняя его простым, используйте метод Java String.replaceAll() следующим образом:
Это также работает, когда fileNameWithExt включает в себя полный путь.
Попробуйте код ниже. Использование основных Java основных функций. Он заботится о String s с расширением и без расширения (без символа '.' ). Также рассматривается случай множественного '.' .
Похожие вопросы:
Я взял этот ответ из другого поста. Далее печатается имя файла с расширением. Это работает только для cpp файлов, не для заголовочных файлов при извлечении этого предварительное значение процессор.
пожалуйста, дайте мне знать, как получить имя файла только без расширения из пути к файлу. Нравится У меня путь к файлу в базе данных есть Attachments\abc\demo.jpg Я хотел бы получить только demo.
Я хочу получить имя файла без расширения файла в Vim. Я написал следующие функции в моем файле .vimrc для компиляции и запуска программы Java. :function! JAVA_RUN() :!javac %^M :endfunction map.
Я пытаюсь получить имя файла без расширения текущего файла документа в Omnigraffle Professional 5. tell application OmniGraffle Professional 5 set _document to front document set _path to path of.
Я хочу получить имя файла изображения без расширения в MATLAB. Я попытался использовать функцию (fileparts )как: [pathstr, name, ext, versn] = fileparts(filename); в этой функции (имя файла) должно.
Если у меня есть имя файла, подобное одному из этих: 1.1.1.1.1.jpg 1.1.jpg 1.jpg Как я мог получить только имя файла, без расширения? Подойдет ли regex?
Читайте также: