Como obter o nome do arquivo sem a extensão em Java?

Alguém pode me dizer como obter o nome do arquivo sem a extensão? Exemplo:

fileNameWithExt = "test.xml"; fileNameWithOutExt = "test"; 

Se você, como eu, preferir usar algum código de biblioteca onde provavelmente pensou em todos os casos especiais, como o que acontece se você passar em null ou pontos no caminho, mas não no nome do arquivo, você pode usar o seguinte:

 import org.apache.commons.io.FilenameUtils; String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt); 

A maneira mais fácil é usar uma expressão regular.

 fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", ""); 

A expressão acima removerá o último ponto seguido por um ou mais caracteres. Aqui está um teste unitário básico.

 public void testRegex() { assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", "")); assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", "")); } 

Veja o seguinte programa de teste:

 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.")); } } 

quais saídas:

 test.xml -> test test.2.xml -> test.2 test -> test test. -> test 

Se seu projeto usa o Guava (14.0 ou mais recente), você pode ir com Files.getNameWithoutExtension() .

(Essencialmente o mesmo que FilenameUtils.removeExtension() do Apache Commons IO, como a resposta mais votada sugere. Só queria salientar que o Guava também faz isso. Pessoalmente, eu não queria adicionar dependência ao Commons – que eu sinto que é um pouco de uma relíquia – apenas por causa disso.)

Aqui está a ordem da lista consolidada por minha preferência.

Usando o apache commons

 import org.apache.commons.io.FilenameUtils; String fileNameWithoutExt = FilenameUtils.getBaseName(fileName); OR String fileNameWithOutExt = FilenameUtils.removeExtension(fileName); 

Usando o Google Goiaba (se você já estiver usando)

 import com.google.common.io.Files; String fileNameWithOutExt = Files.getNameWithoutExtension(fileName); 

Ou usando o Core Java

1)

 String fileName = file.getName(); int pos = fileName.lastIndexOf("."); if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character. fileName = fileName.substring(0, pos); } 

2)

 if (fileName.indexOf(".") > 0) { return fileName.substring(0, fileName.lastIndexOf(".")); } else { return fileName; } 

3)

 private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$"); public static String getFileNameWithoutExtension(File file) { return ext.matcher(file.getName()).replaceAll(""); } 

API do Liferay

 import com.liferay.portal.kernel.util.FileUtil; String fileName = FileUtil.stripExtension(file.getName()); 

Embora eu acredite muito na reutilização de bibliotecas, o JAR org.apache.commons.io tem 174 KB, o que é notavelmente grande para um aplicativo para dispositivos móveis.

Se você fizer o download do código-fonte e der uma olhada na class FilenameUtils, verá que há muitos utilitários extras e ele trata dos caminhos Windows e Unix, o que é ótimo.

No entanto, se você quiser apenas alguns methods de utilitário estáticos para uso com caminhos de estilo Unix (com um separador “/”), poderá achar útil o código abaixo.

O método removeExtension preserva o restante do caminho junto com o nome do arquivo. Há também um getExtension semelhante.

 /** * Remove the file extension from a filename, that may include a path. * * eg /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 "." * * eg /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; } 

Veja abaixo a referência em 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. * 

* eg 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); } }

Se você não gosta de importar o apache.commons completo, eu extraí a mesma funcionalidade:

 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; } } } 

Você pode dividir por “.” e no índice 0 é o nome do arquivo e em 1 é a extensão, mas eu iria inclinar para a melhor solução com FileNameUtils de apache.commons-io como foi mencionado no primeiro artigo. Não precisa ser removido, mas é suficiente:

String fileName = FilenameUtils.getBaseName("test.xml");

Experimente o código abaixo. Usando as principais funções básicas do Java. Ele cuida de String s com extensão e sem extensão (sem o caractere '.' ). O caso de múltiplos '.' também é coberto.

 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); } 

Você pode adaptá-lo para trabalhar com seqüências null .