Как получить имя объекта 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("\\.");. То есть, в основном, избегая ., поскольку он обрабатывается как все символы в регулярном выражении.

Ответ 6

В вашем коде есть две проблемы...

1) Просто используя "." поскольку аргумент о расколе интерпретируется как Rejex, которого вы не хотите. Вам нужна буквальная точка. Поэтому вам нужно избегать этого...

openFile.getName().split("\\.");

2) Вы неправильно проанализируете любой файл с более чем одной точкой. Лучший способ сделать это - найти последнюю точку и получить подстроку...

int pos = openFile.getName().lastIndexOf(".");
if(pos != -1) {
   String name = openFile.getName().substring(0, pos);
}