Как получить имя объекта File без его расширения в Java?
Я пытаюсь получить имя объекта File
без его расширения, например. получение "растительности", когда имя файла "vegetation.txt". Я пробовал реализовать этот код:
openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];
К сожалению, он возвращает объект null
. Я думаю, проблема заключается только в определении объекта String
, потому что метод getName()
работает правильно; он дает мне имя файла с его расширением.
Есть ли у вас идеи?
Ответы
Ответ 1
Если вы хотите реализовать это самостоятельно, попробуйте следующее:
String name = file.getName();
int pos = name.lastIndexOf(".");
if (pos > 0) {
name = name.substring(0, pos);
}
(Этот вариант не оставляет вас пустой строкой для входного имени файла, такого как ".txt". Если вы хотите, чтобы в этом случае строка была пустой, измените > 0
на >= 0
.)
Вы можете заменить оператор if
присваиванием с помощью условного выражения, если вы считаете, что ваш код более читабельен; например, @Steven. (Я не думаю, что это так... но это вопрос мнения.)
Возможно, лучше использовать реализацию, которую кто-то написал и протестировал. Apache FilenameUtils
- хороший выбор; см. @slachnick Ответ, а также связанный Q & A.
Ответ 2
Если вы не хотите сами писать этот код, вы можете использовать Apache FilenameUtils.
FilenameUtils.getBaseName(openFile.getName());
Это вернет имя файла за вычетом пути и расширения.
Ответ 3
Я предпочитаю отрубать перед последним индексом "." быть именем файла.
Таким образом, имя файла: hello.test.txt - это просто hello.test
то есть.
int pos = filename.lastIndexOf(".");
String justName = pos > 0 ? filename.substring(0, pos) : filename;
Вам нужно обработать и расширение без него.
Ответ 4
Вы можете попробовать split("\\.");
. То есть, в основном, избегая .
, поскольку он обрабатывается как все символы в регулярном выражении.
Ответ 5
String # split принимает регулярное выражение. "" соответствует любому символу, поэтому вы получаете массив пустых строк - по одному для каждого места между каждой парой символов.
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)
Ответ 6
В вашем коде есть две проблемы...
1) Просто используя "." поскольку аргумент о расколе интерпретируется как Rejex, которого вы не хотите. Вам нужна буквальная точка. Поэтому вам нужно избегать этого...
openFile.getName().split("\\.");
2) Вы неправильно проанализируете любой файл с более чем одной точкой. Лучший способ сделать это - найти последнюю точку и получить подстроку...
int pos = openFile.getName().lastIndexOf(".");
if(pos != -1) {
String name = openFile.getName().substring(0, pos);
}