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

83

Me gustaría comprobar si una ruta (introducida en Java 7) termina con una determinada 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 el endsWith()método solo devuelve verdadero si hay una coincidencia completa para todo después del separador de directorio final (por ejemplo bar.java), lo cual no es práctico para mí.

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

Thunderforge
fuente
1
@assylias, esa pregunta es para encontrar la extensión de a String, no a Path(aunque funcionaría con Path.toString(), pero esperaba una forma que no requiriera eso).
Thunderforge
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.
Assylias
@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 utilizan mucho en aplicaciones de escritorio y servidor.
Eric Duminil

Respuestas:

82

PathMatcher de Java NIO proporciona FileSystem.getPathMatcher (String syntaxAndPattern) :

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

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

Consulte el tutorial de búsqueda de archivos para obtener más detalles.

ventilador
fuente
14
Creo que a esto le falta un asterisco, lo siguiente me funciona:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
Josh
22
Y si está buscando en diferentes directorios, debe usar "glob: **. Java"
LaGrandMere
1
Para mí, el comentario de LaGrandMere funcionó. Si @Dave Jarvis pudiera fusionar su consejo en la respuesta elegida, supongo que eso ayudaría a los principiantes en la NIO-API. Bajo Windoze: si quiero usar glob:*.java, entonces filenameno debería contener ninguna ruta principal. Si utilizo una ruta rel / abs como glob:c:/users/muchwow/*.java, funciona (tenga en cuenta que \\\\ debe usarse con barras invertidas). El patrón glob:**.javasolo busca todo lo que contenga * .java, independientemente de la ruta principal.
JackLeEmmerdeur
67

La Pathclase no tiene la noción de "extensión", probablemente porque el propio sistema de archivos no la tiene. Es por eso que debe verificar su Stringrepresentación y ver si termina con la cadena de cuatro cinco caracteres .java. Tenga en cuenta que necesita una comparación diferente a la simple endsWithsi desea cubrir casos mixtos, como ".JAVA"y ".Java":

path.toString().toLowerCase().endsWith(".java");
Variable miserable
fuente
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 hace
15

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 tu 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
Pero122
fuente
3

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 toString en la ruta y llame a endsWith en esa cadena.
marca
fuente