¿Cómo obtener el nombre de archivo sin la extensión en Java?

¿Alguien puede decirme cómo obtener el nombre de archivo sin la extensión? Ejemplo:

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

Si usted, como yo, prefiere usar algún código de biblioteca donde probablemente hayan pensado en todos los casos especiales, como lo que sucede si pasa nulo o puntos en la ruta pero no en el nombre del archivo, puede usar lo siguiente:

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

La forma más fácil es usar una expresión regular.

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

La expresión anterior eliminará el último punto seguido de uno o más caracteres. Aquí hay una prueba de unidad básica.

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

Vea el siguiente progtwig de prueba:

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

qué salidas:

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

Si su proyecto utiliza Guava (14.0 o más reciente), puede ir con Files.getNameWithoutExtension() .

(Esencialmente el mismo que FilenameUtils.removeExtension() de Apache Commons IO, como lo sugiere la respuesta más votada . Solo quería señalar que Guava también lo hace. Personalmente, no quería agregar dependencia a Commons, lo que creo es una como una reliquia, solo por esto.)

Aquí está el orden de la lista consolidada por mi preferencia.

Usando apache commons

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

Usando Google Guava (Si ya lo está usando)

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

O usando 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 de Liferay

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

Si bien soy muy partidario de reutilizar las bibliotecas, el JAR org.apache.commons.io es de 174 KB, que es notoriamente grande para una aplicación móvil.

Si descarga el código fuente y echa un vistazo a su clase FilenameUtils, puede ver que hay muchas utilidades adicionales, y que hace frente a las rutas de Windows y Unix, lo cual es encantador.

Sin embargo, si solo quiere un par de métodos de utilidad estáticos para utilizar con las rutas de estilo de Unix (con un separador “/”), puede encontrar útil el siguiente código.

El método removeExtension conserva el rest de la ruta junto con el nombre del archivo. También hay una getExtension similar.

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

A continuación se encuentra una referencia de 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); } }

Si no desea importar todo apache.commons, he extraído la misma funcionalidad:

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

Puedes dividirlo por “.” y en el índice 0 es el nombre del archivo y en el 1 es la extensión, pero me inclinaría por la mejor solución con FileNameUtils de apache.commons-io como se mencionó en el primer artículo. No tiene que ser eliminado, pero lo suficiente es:

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

Pruebe el código a continuación. Usando las funciones básicas básicas de Java. Cuida String s con extensión y sin extensión (sin el carácter '.' ). El caso de múltiples '.' también está cubierto.

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

Puede adaptarlo para trabajar con cadenas null .