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

fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
InformationsquelleAutor Iso | 2009-05-29

12 Comentarios

  1. 392

    Si usted, como yo, prefiero utilizar alguna librería de código donde ellos probablemente han pensado en todos los casos especiales, tales como ¿qué sucede si se pasa null o puntos en el camino, pero no en el nombre de archivo, puede utilizar la siguiente:

    import org.apache.commons.io.FilenameUtils;
    String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
    • también puede utilizar FilenameUtils.getBasename para ir directamente a partir de una cadena de ruta de acceso a un nombre de archivo sin extensión.
    • De donde sacas la .jar para esto?
    • La forma más fácil es, por supuesto, ejecutar maven 🙂 de lo Contrario, véase: commons.apache.org/io
    • Para aquellos que prefieren la Guayaba, se puede hacer esto también. (En estos días no me siento personalmente muy buena acerca de la adición de Apache Commons dependencias, aunque tradicionalmente las bibliotecas han sido muy útiles.)
    • Mientras que la Guayaba y Commons-IO puede ofrecer un poco más, usted se sorprenderá de cómo muchos de los métodos de conveniencia ya son incluido en el JDK 7 con java.nio.file.Files y Path — tales como la resolución de la base de directorios, uno de la línea de copiar/mover archivos, obtener sólo el nombre de archivo, etc.
    • Durkan actualmente FilenameUtils.getBaseName con capital N
    • ¿Cómo FilenameUtils no está disponible cuando se utiliza esta versión: implementation 'commons-io:commons-io:20030203.000550' ? Fue reemplazado con algo más?
    • esta versión es de 2005, demasiado viejo, marque aquí mvnrepository.com/artifact/commons-io/commons-io

  2. 142

    La forma más sencilla es utilizar una expresión regular.

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

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

    public void testRegex() {
        assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
        assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
    }
    • Regex no es tan fácil de usar como el de la biblioteca de la solución anterior. Funciona, pero mirando el código (sin tener que interpretar la expresión REGEX) no es obvio lo que hace.
    • Android no vienen con org.apache.commons. Hasta donde yo sé, esta es la única manera de hacerlo en Android.
    • /* el siguiente expresión también elimina la ruta de acceso */ «/la/ruta/nombre.la extensión de».replaceAll(«.*[\\\\/]|\\.[^\\.]*$»,»»);
    • Me gustaría añadir barras para el segundo carácter de la clase para asegurarse de que no se haya disparado por un camino como el «/foo/bar.x/baz»
  3. 52

    Ver el siguiente programa 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."));
        }
    }

    que las salidas:

    test.xml   -> test
    test.2.xml -> test.2
    test       -> test
    test.      -> test
    • ¿Qué es la extensión de foo.tar.gz? Puedo ver por qué .tar.gz sería lo que quiere.
    • es un formato gzip versión de foo.tar por lo que podría también argumentar que gz fue la extensión. Todo se reduce a como definir la extensión.
    • qué hacer con los archivos como .gitignore?
    • como ustedes saben el nombre de la clase en java no deben comenzar con letra pequeña !
    • Si esa fuera una regla, el lenguaje de aplicarla. Pues no, es una pauta, sin embargo fuertemente se sugiere. En cualquier caso, eso es totalmente irrelevante para la pregunta y la respuesta.
  4. 40

    Si su proyecto utiliza La guayaba (14.0 o superior), usted puede ir con Archivos.getNameWithoutExtension().

    (Esencialmente el mismo como FilenameUtils.removeExtension() de Apache Commons IO, como el la más alta votación de respuesta sugiere. Sólo quería señalar Guayaba hace esto también. Personalmente yo no quiero añadir la dependencia a Commons—que me parece que es un poco de una reliquia a causa de esto).

    • en realidad es más como FilenameUtils.getBaseName()
  5. 37

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

    El uso de apache commons

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

    El uso de Google de Guayaba (Si la u ya utilizando)

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

    O el uso de 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("");
    }

    Liferay API

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

    Por debajo de la 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.
     * <p/>
     * e.g. 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);
        }
    }
    • Buen info, pero los usuarios, estar al tanto de los casos como «.htaccess», donde este método devolverá «».
  7. 5

    Si no te gusta para importar el pleno de 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;
    }
    }
    }
  8. 4

    Mientras que yo soy un gran creyente en la reutilización de las bibliotecas, la org.apache.commons.io JAR es 174KB, que es bastante grande para una aplicación móvil.

    Si se descarga el código fuente y echar un vistazo a su FilenameUtils de la clase, usted puede ver que hay un montón de utilidades extra, y lo hace frente con Windows y Unix caminos, que es todo precioso.

    Sin embargo, si usted sólo quiere un par de estática métodos de utilidad para su uso con el estilo Unix de rutas (con un separador»/»), usted puede encontrar el código de abajo útil.

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

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

    Se puede dividir por «.» y en el índice 0 es el nombre del archivo y el 1 es la extensión, pero me hubiera inclinado 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 suficiente es:

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

  10. 0
    public static String getFileExtension(String fileName) {
    if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
    return fileName.substring(fileName.lastIndexOf(".") + 1);
    }
    public static String getBaseFileName(String fileName) {
    if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
    return fileName.substring(0,fileName.lastIndexOf("."));
    }
  11. -1

    Uso FilenameUtils.removeExtension de Apache Commons IO

    Ejemplo:

    Puede proporcionar nombre completo de la ruta o sólo el nombre de archivo.

    String myString1 = FilenameUtils.removeExtension("helloworld.exe"); //returns "helloworld"
    String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); //returns "yey"

    Espero que esto ayude ..

    • Que ya está en la aceptación de la respuesta, ¿cuál es el punto de este post?
  12. -3

    Tratar el siguiente código. El uso de core Java funciones básicas. Se encarga de Strings 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);
    }

    Se puede adaptar para trabajar con null cadenas.

    • Es bastante malas prácticas para implementar este tipo de funcionalidad a ti mismo. En la primera vista, la tarea parece ser muy obvio, pero en la práctica se enfrentará a una gran cantidad de excepcionales situaciones (como no hay . en el nombre de archivo, o es un archivo de copia de seguridad y tiene nombre como document.docx.backup, etc). Es mucho más fiable para el uso externo de la biblioteca en la que se aborda todas esta situaciones excepcionales para usted.
    • Por otro lado la adición de muchas bibliotecas para su proyecto hará más grande. Cosas simples como esto puede ser hecho por ti mismo.
    • No hay manera que usted debe hacer esto por sí mismo. Esto es duro: archivos sin extensión, pero . en la ruta, ftp caminos, windows y unix barras, enlaces simbólicos, etc… Que sin duda va a fallar y tratando de obtener un poco más de memoria que se anuncio una gran cantidad de precariedad. En el mínimo de la copia de las fuentes de código establecido si las licencias lo permiten.
    • Este código se parece a la de Amit Mishra, excepto por la intimidante ‘if (!str.contiene(«.»))’
    • de fallar en el caso siguiente «/someFolder/algunos.otros.carpeta/someFileWithoutExtention». Lo primero que apareció en la mente después de 2 segundos.. estoy seguro de que podría venir para arriba con una tonelada de carga de otros ejemplos.

Dejar respuesta

Please enter your comment!
Please enter your name here