Java только имя файла

Как получить имя файла без расширения в 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.

Читайте также:  Add javascript to wordpress

/ * следующее регулярное выражение также удаляет путь * / «/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, Files, Path - 1

— Интересно. А когда ты говоришь «управлять файлами», что ты имеешь в виду?

— Как раз сейчас и расскажу. Файлы можно создавать, удалять, переименовывать и еще много чего. Практически во все классы, которые работают (читают, пишут, изменяют) с содержимым файла, можно передавать объект класса 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.

Источник

Оцените статью