- Как получить имя файла без расширения в Java?
- File, Files, Path
- Русские Блоги
- 3 способа получить имя файла из пути к файлу в Java
- Интеллектуальная рекомендация
- Backup failed Status 4277
- Обработка даты IOS — Дата анализа (воспроизводится)
- [1,1] illegal character: ‘\ufeff’ [1,10] class, interface, or enum expected
- Pat Class B Trotenes 1001: A + B и C
- docker LVS NAT nginx
Как получить имя файла без расширения в Java?
Если вы, как и я, предпочитаете использовать некоторый библиотечный код, где они, вероятно, думали обо всех особых случаях, например, что происходит, если вы проходите в null или точках на пути, но не в filename, вы можете использовать следующее:
import org.apache.commons.io.FilenameUtils; String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
Вы также можете использовать FilenameUtils.getBasename для перехода от строки пути к имени файла без расширения.
Для тех, кто предпочитает гуаву, он тоже может это сделать . (В настоящее время мне не очень приятно добавлять зависимости Apache Commons, хотя исторически эти библиотеки были очень полезны.)
Хотя Guava и Commons-IO могут предложить немного больше, вы будете удивлены тем, сколько вспомогательных методов уже включено в JDK 7 с java.nio.file.Files и Path — таких как разрешение базовых каталогов, однострочное копирование / перемещение файлов, получение только имени файла и т. д.
Самый простой способ — использовать регулярное выражение.
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
Вышеприведенное выражение удалит последнюю точку, за которой следует один или несколько символов. Вот базовый unit test.
Regex не так прост в использовании, как решение библиотеки выше. Это работает, но смотреть на код (без необходимости интерпретировать REGEX) не очевидно, что он делает.
@GustavoLitovsky Android не поставляется в комплекте с org.apache.commons . Насколько я знаю, это единственный способ сделать это в Android.
/ * следующее регулярное выражение также удаляет путь * / «/the/path/name.extension».replaceAll(«.*[\\\\]]\\\[^\\.]*$», «») ;
Я бы добавил косые черты ко второму символьному классу, чтобы убедиться, что вы не запутались в пути типа «/foo/bar.x/baz»
См. следующую тестовую программу:
public class javatemp < static String stripExtension (String str) < // Handle null case specially. if (str == null) return null; // Get position of last '.'. int pos = str.lastIndexOf("."); // If there wasn't any '.' just return the string as is. if (pos == -1) return str; // Otherwise return the string, up to the dot. return str.substring(0, pos); >public static void main(String[] args) < System.out.println ("test.xml ->" + stripExtension ("test.xml")); System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml")); System.out.println ("test -> " + stripExtension ("test")); System.out.println ("test. -> " + stripExtension ("test.")); > >
test.xml -> test test.2.xml -> test.2 test -> test test. -> test
@tchrist, foo.tar.gz — это версия foo.tar в формате gzip, так что вы также можете утверждать, что gz был расширением. Все сводится к тому, как вы определяете расширение.
Если бы это было правилом, язык обеспечил бы его соблюдение. Поскольку это не так, это руководство, как бы сильно оно ни предлагалось. В любом случае, это совершенно не имеет отношения к вопросу и ответу.
Если ваш проект использует Guava (14.0 или новее), вы можете пойти с Files.getNameWithoutExtension() .
(По сути, это то же самое, что и FilenameUtils.removeExtension() от Apache Commons IO, как говорит самый высокий голос. Просто хотел указать на то, что Guava тоже делает это. не хотел добавлять зависимость от Commons, что я считаю немного реликвией — просто из-за этого.)
Вот список упорядоченных списков по моим предпочтениям.
Использование apache commons
import org.apache.commons.io.FilenameUtils; String fileNameWithoutExt = FilenameUtils.getBaseName(fileName); OR String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
Использование Google Guava (если вы уже используете его)
import com.google.common.io.Files; String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);
Или используя Core Java
String fileName = file.getName(); int pos = fileName.lastIndexOf("."); if (pos > 0)
/** * Gets the base name, without extension, of given file name. * * e.g. getBaseName("file.txt") will return "file" * * @param fileName * @return the base name */ public static String getBaseName(String fileName) < int index = fileName.lastIndexOf('.'); if (index == -1) < return fileName; >else < return fileName.substring(0, index); >>
Хорошая информация, но пользователи должны знать о случаях, подобных «.htaccess», где этот метод будет возвращать «».
Хотя я большой сторонник повторного использования библиотек, org.apache.commons.io JAR составляет 174 КБ, что заметно велико для мобильное приложение.
Если вы загрузите исходный код и посмотрите на свой класс FilenameUtils, вы увидите, что есть много дополнительных утилит, и он справляется с путями Windows и Unix, и это все прекрасно.
Однако, если вам просто нужна пара статических методов утилиты для использования с стилями стиля Unix (с разделителем «/» ), вы можете найти полезный код.
Метод removeExtension сохраняет остальную часть пути вместе с именем файла. Существует также аналогичный getExtension .
/** * Remove the file extension from a filename, that may include a path. * * e.g. /path/to/myfile.jpg -> /path/to/myfile */ public static String removeExtension(String filename) < if (filename == null) < return null; >int index = indexOfExtension(filename); if (index == -1) < return filename; >else < return filename.substring(0, index); >> /** * Return the file extension from a filename, including the "." * * e.g. /path/to/myfile.jpg -> .jpg */ public static String getExtension(String filename) < if (filename == null) < return null; >int index = indexOfExtension(filename); if (index == -1) < return filename; >else < return filename.substring(index); >> private static final char EXTENSION_SEPARATOR = '.'; private static final char DIRECTORY_SEPARATOR = '/'; public static int indexOfExtension(String filename) < if (filename == null) < return -1; >// Check that no directory separator appears after the // EXTENSION_SEPARATOR int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR); int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR); if (lastDirSeparator > extensionPos) < LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension"); return -1; >return extensionPos; >
File, Files, Path
— Сегодня я расскажу о работе с файлами. В Java есть специальный класс (File), с помощью которого можно управлять файлами на диске компьютера. Для того чтобы управлять содержимым файлов, есть другие классы: FileInputStream, FileOutputStream,…
— Интересно. А когда ты говоришь «управлять файлами», что ты имеешь в виду?
— Как раз сейчас и расскажу. Файлы можно создавать, удалять, переименовывать и еще много чего. Практически во все классы, которые работают (читают, пишут, изменяют) с содержимым файла, можно передавать объект класса File. Пример:
FileInputStream input = new FileInputStream("c:/path/a.txt");
File file = new File("c:/path/a.txt"); FileInputStream input = new FileInputStream(file);
— Но во втором случае длиннее же получается. Так и не понял – зачем эти файлы нужны.
— Для этого конкретного случая – да. Это не пример, как надо делать, а скорее – как можно.
Но вот представь, что тебе нужно вывести на экран список всех файлов, которые находятся в определенной директории (папке). Вот как это можно сделать с помощью файлов:
File folder = new File("c:/path/"); for (File file : folder.listFiles()) < System.out.println(file.getName()); >
— listFiles() – это метод, который возвращает список файлов в папке с именем «c:/path/»?
— Да. Хотя программисты обычно говорят «директория» или «каталог». Название «папка» стало употребляться совсем недавно, но, в принципе, они все верные, и ты можешь говорить, как тебе удобнее.
— Ок. А getName() что делает? Выдает имя файла? И какое именно имя? Полное вместе с путем или только имя самого файла?
— Только имя самого файла. Для полного есть file.getAbsolutePath()
— А какие еще методы есть у класса File?
Метод | Описание |
---|---|
boolean isDirectory() | Является ли «объект файла» директорией |
boolean isFile() | Является ли объект файлом |
long length() | Возвращает размер/длину файла в байтах. |
boolean createNewFile() | Создает файл. Если такой файл уже был, возвращает false. |
boolean mkdir() | Создает директорию. Название mkdir происходит от «make directory». |
boolean mkdirs() | Создает директорию и все поддиректории. |
boolean delete() | Удаляет файл объекта на диске. Если объект – директория, то только, если в ней нет файлов. |
void deleteOnExit() | Добавляет файл в специальный список файлов, которые будут автоматически удалены при закрытии программы. |
File createTempFile( String prefix, String suffix, File directory) | Создает «временный файл» — файл с случайно сгенерированным уникальным именем – что-типа «dasd4d53sd». Дополнительные параметры – префикс к имени, суффикс (окончание). Если директория не указана, то файл создается в специальной директории ОС для временных файлов |
boolean exists() | Возвращает true, если файл с таким именем существует на диске компьютера. |
String getAbsolutePath() | Возвращает полный путь файла со всеми поддиректориями. |
String getCanonicalPath() | Возвращает канонический путь файла. Например, преобразовывает путь «c:/dir/dir2/../a.txt» к пути «c:/dir/a.txt» |
String[] list() | Возвращает массив имен файлов, которые содержатся в директории, которой является текущий объект-файл. |
File[] listFiles() | Возвращает массив файлов, которые содержатся в директории, которой является текущий объект-файл. |
long getTotalSpace() | Возвращает размер диска (количество байт) на котором расположен файл. |
long getFreeSpace() | Возвращает количество свободного места (количество байт) на диске, на котором расположен файл. |
boolean renameTo(File) | Переименовывает файл – содержимое файла фактически получает новое имя. Т.е. можно переименовать файл «c:/dir/a.txt» в «d:/out/text/b.doc». |
String getName() | Возвращает только имя файла, без пути. |
String getParent() | Возвращает только путь (директорию) к текущему файлу, без самого имени. |
Path toPath() | Возвращает объект Path, который соответствует текущему объекту File. |
— Ничего себе! А немаленький такой список получился. Да и вроде, можно довольно много сделать с помощью него: создавать, удалять файлы, переименовывать,…
А чтобы получить директорию текущего файла, надо вызвать getParent()?
— Ага, но он вернет не объект-файл, а строку – путь к файлу. Фактически у класса File почти все методы дублированы: одна версия возвращает String, вторая File. Вот смотри:
File file = new File("c:/path/a.txt"); String directory = file.getParent();
File file = new File("c:/path/a.txt"); File directory = file.getParentFile();
Если у тебя есть строка с путем к файлу, а надо объект File, то воспользуйся конструктором. Если же наоборот – есть объект File, а нужна строка – используй getAbsolutePath(). Пример:
String path text-green">c:/a.txt"; File file = new File(path);
File file = new File("c:/a.txt"); String path = file.getAbsolutePath();
— Отлично. Тогда вот тебе маленькое задание – выведи имена всех файлов, которые есть в той же директории, что и текущий файл.
— Нет ничего проще, вот, смотри:
//какой-то текущий файл File originalFile = new File("c:/path/dir2/a.txt"); //объект-директория File folder = originalFile.getParentFile(); //печать списка файлов на экран for (File file : folder.listFiles()) < System.out.println(file.getName()); >
— А то! Немного путает, что и для файла и для директории используется один и тот же класс – File. Как то это не очень логично, мне кажется.
— Так исторически сложилось. Раньше директория была специальным «пустым» файлом на диске. Сейчас уже, конечно, многое изменилось, но не везде. У меня на сегодня все.
— Спасибо, за отличную лекцию, Билаабо.
Русские Блоги
3 способа получить имя файла из пути к файлу в Java
package test;
import java.io.File;
public class FileName
/**
* @param args
*/
public static void main(String[] args) // Пример:
String fName =" G:\\Java_Source\\navigation_tigra_menu\\demo1\\img\\lev1_arrow.gif ";
// метод первый:
File tempFile =new File( fName.trim());
String fileName = tempFile.getName();
System.out.println("fileName = " + fileName);
// Метод второй:
String fName = fName.trim();
String fileName = fName.substring(fName.lastIndexOf("/")+1);
// или
String fileName = fName.substring(fName.lastIndexOf("\\")+1);
System.out.println("fileName = " + fileName);
// Метод третий:
String fName = fName.trim();
String temp [] = fName.split ("\\\\"); / ** split должен быть регулярным выражением, "\\" используется для экранирования строки * /
String fileName = temp[temp.length-1];
System.out.println("fileName = " + fileName);
>
>
Интеллектуальная рекомендация
Backup failed Status 4277
Недавно столкнувшись с случаем сбоя резервного копирования VMware, статус: (4277) Путь виртуальной машины содержит неподдерживаемые символы Из отчета можно увидеть, что виртуальная машина содержит неп.
Обработка даты IOS — Дата анализа (воспроизводится)
[1,1] illegal character: ‘\ufeff’ [1,10] class, interface, or enum expected
Каждый новый класс файл новый, сообщите о некоторых ошибках при компиляции, знаете искажены? Как вы можете иметь дело с этим! Оказалось, что я случайно не буду осторожен при изменении конфигурации нас.
Pat Class B Trotenes 1001: A + B и C
A + B и C (15) Ограничение времени 1000 мс Лимит памяти 32768 КБ Длина кода Длина 100 КБ программа SURAME SHARGEN Тема Описание Описание ввода: Описание вывода: Кодовое шоу, как показано ниже: &.
docker LVS NAT nginx
LVS lvs , CIP ( IP)VIP == DIP( IP) RIP( IP) lvs-nat: IP, IP DNAT ( , ) , ( 、 ), VIP , LVS(TUN) , 。 lvs-dr: MAC (DR ) ,VIP , IP VIP.