Cómo comprobar la extensión de una ruta de Java 7

3 minutos de lectura

avatar de usuario
Forja del Trueno

Me gustaría comprobar si un Sendero (introducido en Java 7) termina con cierta extensión. Probé el endsWith() método así:

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}

Sin embargo, esto no parece funcionar porque path.endsWith(".java") devuelve falso. parece que endsWith() El método solo devuelve verdadero si hay una coincidencia completa para todo después del separador de directorio final (p. ej. bar.java), que no es práctico para mí.

Entonces, ¿cómo puedo verificar la extensión de archivo de una ruta?

  • stackoverflow.com/questions/3571223/…

    – asilias

    11 de diciembre de 2013 a las 22:44

  • @assylias, esa pregunta es para encontrar la extensión de un StringNo un Path (aunque funcionaría con Path.toString()pero esperaba una forma que no requiriera eso).

    – Forja del Trueno

    12 de diciembre de 2013 a las 0:43


  • La noción de extensión de archivo depende del sistema operativo, por lo que no creo que haya soporte para ella en Archivo o Ruta.

    – asilias

    12 de diciembre de 2013 a las 8:05


  • @assylias: Bueno, eso apesta. La noción de extensión de archivo está bien definida y se usa muchas veces en Windows/Linux/MacOs/Android. Aunque pueden ser menos importantes en Linux que en Windows, todavía se usan mucho en aplicaciones de escritorio y servidor.

    –Eric Duminil

    29 de noviembre de 2019 a las 13:24

avatar de usuario
admirador

Java NIO PathMatcher proporciona FileSystem.getPathMatcher (sintaxis de cadena y patrón):

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}

Ver el Búsqueda de archivos tutorial para más detalles.

  • Creo que a esto le falta un asterisco, lo siguiente me funciona: PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

    – José

    18 de agosto de 2015 a las 13:38

  • Y si está buscando en diferentes directorios, debe usar “glob:**.java”

    – LaGrandMere

    27 de agosto de 2015 a las 11:22

  • Para mí, el comentario de LaGrandMere funcionó. Si @Dave Jarvis pudiera fusionar su consejo con la respuesta elegida, supongo que eso ayudaría a los principiantes en NIO-API. En Windows: si quiero usar glob:*.javadespués filename no debe contener ninguna ruta principal. Si uso una ruta rel/abs como glob:c:/users/muchwow/*.java, funciona (tenga en cuenta que \\\\ debe usarse con barras invertidas). El patrón glob:**.java simplemente busca todo lo que contenga *.java, independientemente de la ruta principal.

    – Jack Le Emmerdeur

    31 de agosto de 2017 a las 12:30

  • Lanzar un PathMatcher a este problema es un martillo bastante costoso, en comparación con simplemente verificar si el nombre del archivo (cadena) termina con un sufijo.

    – Primavera máxima

    9 de junio de 2021 a las 17:58

avatar de usuario
variable miserable

los Path class no tiene una noción de “extensión”, probablemente porque el propio sistema de archivos no la tiene. Por eso es necesario comprobar su String representación y ver si termina con la cuatro cinco cadena de caracteres .java. Tenga en cuenta que necesita una comparación diferente a la simple endsWith si desea cubrir mayúsculas y minúsculas, como ".JAVA" y ".Java":

path.toString().toLowerCase().endsWith(".java");

  • Esta no es una buena solución debido a un posible NullPointer. Es mejor usar alguna biblioteca (por ejemplo, apache IO utils) o PathMatcher como se mencionó anteriormente.

    – KHanusova

    17 de noviembre de 2020 a las 9:46

avatar de usuario
pero122

Solución simple:

if( path.toString().endsWith(".java") ) //Do something

Debe tener cuidado al usar el método Path.endsWith. Como dijiste, el método devolverá verdadero solo si coincide con un subelemento de su objeto Path. Por ejemplo:

Path p = Paths.get("C:/Users/Public/Mycode/HelloWorld.java");
System.out.println(p.endsWith(".java")); // false
System.out.println(p.endsWith("HelloWorld.java")); // true

No hay forma de hacer esto directamente en el propio objeto Path.

Hay dos opciones que puedo ver:

  1. Convierta la ruta en un archivo y llame a EndsWith en la cadena devuelta por File.getName()
  2. Llame a la cadena en la ruta y llame a los extremos con en esa cadena.

¿Ha sido útil esta solución?