Может ли кто-нибудь сказать мне, как получить имя файла без расширения? Пример:
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
Может ли кто-нибудь сказать мне, как получить имя файла без расширения? Пример:
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
Если вы, как и я, предпочитаете использовать некоторый библиотечный код, где они, вероятно, думали обо всех особых случаях, например, что происходит, если вы проходите в null или точках на пути, но не в filename, вы можете использовать следующее:
import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
Самый простой способ - использовать регулярное выражение.
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
Вышеприведенное выражение удалит последнюю точку, за которой следует один или несколько символов. Вот базовый unit test.
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
См. следующую тестовую программу:
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
Если ваш проект использует 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) {
fileName = fileName.substring(0, pos);
}
Хотя я большой сторонник повторного использования библиотек, 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;
}
Ниже приведена ссылка из https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java
/**
* Gets the base name, without extension, of given file name.
* <p/>
* 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);
}
}
Если вам не нравится импортировать полные apache.commons, я извлек ту же функциональность:
public class StringUtils {
public static String getBaseName(String filename) {
return removeExtension(getName(filename));
}
public static int indexOfLastSeparator(String filename) {
if(filename == null) {
return -1;
} else {
int lastUnixPos = filename.lastIndexOf(47);
int lastWindowsPos = filename.lastIndexOf(92);
return Math.max(lastUnixPos, lastWindowsPos);
}
}
public static String getName(String filename) {
if(filename == null) {
return null;
} else {
int index = indexOfLastSeparator(filename);
return filename.substring(index + 1);
}
}
public static String removeExtension(String filename) {
if(filename == null) {
return null;
} else {
int index = indexOfExtension(filename);
return index == -1?filename:filename.substring(0, index);
}
}
public static int indexOfExtension(String filename) {
if(filename == null) {
return -1;
} else {
int extensionPos = filename.lastIndexOf(46);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos?-1:extensionPos;
}
}
}
Вы можете разделить его на "." а на индексе 0 - имя файла, а на 1 - расширение, но я бы склонялся к лучшему решению с FileNameUtils из apache.commons-io, как это было упомянуто в первой статье. Его не нужно удалять, но достаточно:
String fileName = FilenameUtils.getBaseName("test.xml");
Попробуйте выполнить приведенный ниже код. Использование основных функций Java. Он заботится о String
с расширением и без расширения (без символа '.'
). Также рассматривается случай множественного '.'
.
String str = "filename.xml";
if (!str.contains("."))
System.out.println("File Name=" + str);
else {
str = str.substring(0, str.lastIndexOf("."));
// Because extension is always after the last '.'
System.out.println("File Name=" + str);
}
Вы можете адаптировать его для работы с строками null
.
FilenameUtils?
System.out.println(FilenameUtils.indexOfExtension("/etc/.hidden_file"));
System.out.println(FilenameUtils.getExtension("/etc/.hidden_file"));
out:
5
hidden_file
indexOfExtension или indexOfDOT?