Есть ли лучший способ получить базовое имя и расширение файла, чем что-то вроде
File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
FilenameUtils
. Она имеетgetBaseName(..)
иgetExtension(..)
методы.Ответы:
Я знаю, что другие упоминали
String.split
, но вот вариант, который дает только два токена (базовый и расширенный):String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
Например:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
Урожайность:
["test.cool.awesome", "txt"]
Регулярное выражение указывает Java разбить на любой период, за которым следует любое количество непериодов, за которым следует конец ввода. Этому определению соответствует только один период (а именно, последний период).
С техническойточки зрения, этот метод называется положительным просмотром вперед нулевой ширины .Кстати, если вы хотите разделить путь и получить полное имя файла, включая, помимо прочего, расширение точки, используя путь с косой чертой,
String[] tokens = dir.split(".+?/(?=[^/]+$)");
Например:
String dir = "/foo/bar/bam/boozled"; String[] tokens = dir.split(".+?/(?=[^/]+$)"); // [ "/foo/bar/bam/" "boozled" ]
источник
Старый вопрос, но я обычно использую это решение:
import org.apache.commons.io.FilenameUtils; String fileName = "/abc/defg/file.txt"; String basename = FilenameUtils.getBaseName(fileName); String extension = FilenameUtils.getExtension(fileName); System.out.println(basename); // file System.out.println(extension); // txt (NOT ".txt" !)
источник
Источник: http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm
такой служебный класс:
class Filename { private String fullPath; private char pathSeparator, extensionSeparator; public Filename(String str, char sep, char ext) { fullPath = str; pathSeparator = sep; extensionSeparator = ext; } public String extension() { int dot = fullPath.lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); } public String filename() { // gets filename without extension int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); } public String path() { int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(0, sep); } }
Применение:
public class FilenameDemo { public static void main(String[] args) { final String FPATH = "/home/mem/index.html"; Filename myHomePage = new Filename(FPATH, '/', '.'); System.out.println("Extension = " + myHomePage.extension()); System.out.println("Filename = " + myHomePage.filename()); System.out.println("Path = " + myHomePage.path()); } }
источник
basename()
было бы лучше вместоfilename()
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName ()
С http://www.xinotes.org/notes/note/774/ :
В Java есть встроенные функции для получения базового имени и имени каталога для заданного пути к файлу, но имена функций не так очевидны.
import java.io.File; public class JavaFileDirNameBaseName { public static void main(String[] args) { File theFile = new File("../foo/bar/baz.txt"); System.out.println("Dirname: " + theFile.getParent()); System.out.println("Basename: " + theFile.getName()); } }
источник
Расширения файлов - это сломанная концепция
И не существует нет надежной функции для него. Рассмотрим, например, это имя файла:
Что такое расширение? Пользователи DOS предпочли бы это имя
archive.tgz
. Иногда вы видите глупые приложения Windows, которые сначала распаковывают файл (что дает.tar
файл), а затем вам нужно снова открыть его, чтобы увидеть содержимое архива.В этом случае более разумным понятием расширения файла было бы
.tar.gz
. Есть также.tar.bz2
,.tar.xz
,.tar.lz
и.tar.lzma
файл «расширения» в использовании. Но как бы вы решили, разделять ли последнюю точку или предпоследнюю точку?Вместо этого используйте mime-типы.
Функция Java 7 Files.probeContentType , вероятно, будет намного надежнее определять типы файлов, чем доверять расширению файла. Практически весь мир Unix / Linux, а также ваш веб-браузер и смартфон уже делают это таким образом.
источник
File
ниPath
позвольте мне отщепить расширение..tar.gz
против.tgz
слишком часто встречается на UNIX). Вместо этого используйте типы пантомимы.Files.probeContentType
имени файла вместо того, чтобы полагаться на правильное расширение?Что не так с вашим кодом? Обернутый аккуратной утилитой, все в порядке.
Важнее то, что использовать в качестве разделителя - первую или последнюю точку. Первый плохо подходит для имен файлов, таких как «setup-2.5.1.exe», последний - для имен файлов с несколькими расширениями, таких как «mybundle.tar.gz».
источник
Вы также можете использовать регулярное выражение Java. String.split () также использует выражение внутри себя. См. Http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
источник
Возможно, вы могли бы использовать String # split
Чтобы ответить на ваш комментарий:
Я не уверен, что их может быть больше одного. в имени файла, но независимо от того, даже если точек больше, вы можете использовать разделение. Рассмотрим, например, что:
String input = "boo.and.foo"; String[] result = input.split(".");
Это вернет массив, содержащий:
{ "boo", "and", "foo" }
Таким образом, вы будете знать, что последний индекс в массиве - это расширение, а все остальные - базовый.
источник
.
в строкеfileName.split("\\.(?=[^\\.]+$)")