ti-enxame.com

Como obter o nome do objeto File sem sua extensão em Java?

Estou tentando obter o nome de um objeto File sem sua extensão, por exemplo obtendo "vegetação" quando o nome do arquivo é "vegetação.txt". Eu tentei implementar este código:

openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];

Infelizmente, ele retorna um objeto null. Há um problema apenas na definição do objeto String, eu acho, porque o método getName() funciona corretamente; me dá o nome do arquivo com sua extensão.

Você tem alguma ideia?

21
MichalB

Se você deseja implementar isso sozinho, tente o seguinte:

String name = file.getName();
int pos = name.lastIndexOf(".");
if (pos > 0) {
    name = name.substring(0, pos);
}

(Essa variação não deixa uma string vazia para um nome de arquivo de entrada como ".txt". Se você deseja que a string fique vazia nesse caso, altere > 0 para >= 0.)


Você poderia substituir a instrução if por uma atribuição usando uma expressão condicional, se pensasse que isso tornava seu código mais legível; veja a resposta de @ Steven, por exemplo. (Acho que não ... mas é uma questão de opinião.)


É sem dúvida uma idéia melhor usar uma implementação que outra pessoa tenha escrito e testado. Apache FilenameUtils é uma boa escolha; veja a resposta de @ slachnick e também as perguntas e respostas vinculadas.

40
Stephen C

Se você não quiser escrever esse código, poderá usar o FilenameUtils do Apache.

FilenameUtils.getBaseName(openFile.getName());

Isso retornará o nome do arquivo menos o caminho e a extensão.

20
slashnick

Prefiro cortar antes do último índice de "." para ser o nome do arquivo. Dessa forma, um nome de arquivo: hello.test.txt é apenas hello.test

isto é.

int pos = filename.lastIndexOf(".");
String justName = pos > 0 ? filename.substring(0, pos) : filename;

Você precisa lidar com não haver extensão também.

5
Steven

Há dois problemas com seu código ...

1) Apenas usando "." como um argumento para dividir está sendo interpretado como um Rejex que você não deseja. Você quer um ponto literal. Então você tem que escapar ...

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

2) Você analisará incorretamente qualquer arquivo com mais de um ponto. A melhor maneira de fazer isso é procurar o último ponto e obter a substring ...

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

Você pode tentar split("\\.");. Ou seja, basicamente escapando do . como é tratado como todos os caracteres no regex.

2
srkavin

A string # split recebe um regex. "." corresponde a qualquer caractere; portanto, você obtém uma matriz de cadeias vazias - uma para cada ponto entre cada par de caracteres.

http://docs.Oracle.com/javase/6/docs/api/Java/lang/String.html#split (Java.lang.String )

2
dokkaebi