HOWTO · Java
Como obter a extensão de um arquivo em Java
Este post apresenta como obter a extensão de um arquivo em Java.
Nesta página
A extensão de arquivo é o sufixo após o último ponto em um nome, como pdf em student-records.pdf. Java não tem um método dedicado para obter a extensão em File ou String, então você chama um utilitário como FilenameUtils do Apache Commons IO ou localiza o último ponto por conta própria com métodos de String. Ambas as abordagens são mostradas abaixo, junto com as regras que as mantêm corretas em caminhos completos.
Obter a extensão de arquivo com o Apache Commons IO
FilenameUtils.getExtension() retorna o texto após o último ponto em um nome de arquivo ou caminho. Ele já conhece os separadores / e \, portanto um ponto dentro do nome de um diretório nunca é confundido com uma extensão, e retorna "" quando o nome não tem extensão utilizável.
A classe não faz parte do JDK, então adicione a dependência commons-io ao seu projeto via Maven ou Gradle, ou coloque o JAR no classpath. Depois de adicionar a dependência, importe org.apache.commons.io.FilenameUtils e chame String extension = FilenameUtils.getExtension(fileName);. Com fileName definido como student-records.pdf, ele retorna pdf.
Como a biblioteca externa é necessária em tempo de compilação, esta chamada de API é mostrada inline; os exemplos executáveis abaixo usam apenas o JDK.
Extrair a extensão com métodos de string do Java
Nenhuma biblioteca é necessária para um nome de arquivo simples: lastIndexOf('.') encontra o último ponto e substring() pega tudo o que vem depois dele.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
public class SimpleTesting {
public static void main(String[] args) {
String fileName = "student-records.pdf";
int dot = fileName.lastIndexOf('.');
String extension = dot > 0 ? fileName.substring(dot + 1) : "";
System.out.println("File extension is : " + extension);
}
}
Saída:
File extension is : pdf
A verificação dot > 0 cobre dois casos em que não há extensão a relatar: readme produz "" porque lastIndexOf retorna -1, e um ponto inicial como em .env é tratado como marcador de nome, e não como separador de extensão. O que esta forma curta não consegue ver é se o ponto está em uma parte de diretório do nome — isso exige a versão ciente de caminho apresentada a seguir.
Lidar com caminhos e casos extremos
Em um caminho completo, o ponto da extensão deve vir depois do último separador de caminho. O auxiliar abaixo verifica tanto / quanto \, portanto uma pasta com ponto como data.d não vaza para o resultado. Ele retorna "" para um ponto ausente, um nome com ponto inicial e um nome que termina em ponto:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
public class SimpleTesting {
static String fileExtension(String path) {
if (path == null) {
return "";
}
int dot = path.lastIndexOf('.');
int sep = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
if (dot <= sep + 1 || dot == path.length() - 1) {
return "";
}
return path.substring(dot + 1);
}
public static void main(String[] args) {
String[] names = {
"folder/s.gr/fg/student-records.pdf",
"C:\\data.d\\reports\\summary.txt",
"folder.d/README",
"folder/.hidden",
"archive.tar."
};
for (String name : names) {
System.out.println(name + " -> '" + fileExtension(name) + "'");
}
}
}
Saída:
folder/s.gr/fg/student-records.pdf -> 'pdf'
C:\data.d\reports\summary.txt -> 'txt'
folder.d/README -> ''
folder/.hidden -> ''
archive.tar. -> ''
O ponto é comparado com sep + 1, e não apenas com sep, portanto um ponto na primeira posição do segmento final do nome também produz "" — este auxiliar trata .hidden como um arquivo oculto sem extensão. FilenameUtils.getExtension() aplica a mesma verificação de separador, mas faz uma escolha diferente nesse caso e retorna hidden para .hidden; ambos concordam em "" para folder.d/README e archive.tar.. Escolha a convenção que seus chamadores esperam.
Escolher a abordagem certa
Use FilenameUtils.getExtension() quando o Apache Commons IO já estiver no seu classpath ou quando você quiser um resultado bem testado com uma única chamada — ele lida com ambos os separadores e com diretórios contendo pontos prontamente. Recorra à versão com String quando quiser zero dependências, não puder adicionar uma biblioteca ou precisar de uma regra personalizada, como o comportamento de ponto inicial mostrado acima; nesse caso, você mesmo assume as verificações de separador e de ponto final.
Para a maioria dos projetos que já fazem E/S de arquivos, FilenameUtils.getExtension() é a escolha mais simples e segura. Para um pequeno utilitário ou um classpath restrito, o auxiliar ciente de caminho cobre o mesmo terreno em poucas linhas.