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?
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:*.java
despuésfilename
no debe contener ninguna ruta principal. Si uso una ruta rel/abs comoglob:c:/users/muchwow/*.java
, funciona (tenga en cuenta que \\\\ debe usarse con barras invertidas). El patrónglob:**.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
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
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:
- Convierta la ruta en un archivo y llame a EndsWith en la cadena devuelta por File.getName()
- Llame a la cadena en la ruta y llame a los extremos con en esa cadena.
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
String
No unPath
(aunque funcionaría conPath.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