Para ser claros, no estoy buscando el tipo MIME.
Digamos que tengo la siguiente entrada: /path/to/file/foo.txt
Me gustaría una forma de dividir esta entrada, específicamente .txt
para la extensión. ¿Hay alguna forma integrada de hacer esto en Java? Me gustaría evitar escribir mi propio analizador.
"txt"
desde"filename.txt"
ya que algunos plataforma de algún lugar que desee utilizar"filename,txt"
.path.substring(path.lastIndexOf("."));
..... y sí ... seguramente no duplicarán algo por nada ...".txt"
a partir"filename.txt"
, que podría no ser el resultado deseado, y lo peor de todo, se produce un error conStringIndexOutOfBoundsException
en lugar de devolver una cadena vacía si no hay extensión.Respuestas:
En este caso, use FilenameUtils.getExtension de Apache Commons IO
Aquí hay un ejemplo de cómo usarlo (puede especificar la ruta completa o solo el nombre del archivo):
Dependencia de Maven:
Gradle Groovy DSL
Gradle Kotlin DSL
Otros https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
fuente
¿Realmente necesitas un "analizador" para esto?
Suponiendo que se trata de nombres de archivo simples similares a Windows, no algo así
archive.tar.gz
.Por cierto, para el caso de que un directorio pueda tener un '.', Pero el nombre de archivo en sí no (me gusta
/path/to.a/file
), puede hacerfuente
i > 0
debería cambiarse ai >= 0
oi != -1
. Esto se encarga de los nombres de archivo como.htaccess
.fuente
Si usa la biblioteca Guava , puede recurrir a
Files
la clase de utilidad. Tiene un método específico,getFileExtension()
. Por ejemplo:Además, también puede obtener el nombre de archivo con una función similar, getNameWithoutExtension () :
fuente
getFileExtension
hecho, no esint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
gran cosa. Además, tenga en cuenta queFiles
marcado como "inestable" por alguna razón.Si está en Android, puede usar esto:
fuente
Para tener en cuenta los nombres de archivo sin caracteres antes del punto, debe usar esa ligera variación de la respuesta aceptada:
fuente
Este es un método probado
Y caso de prueba:
fuente
Mi sucio y más pequeño usando String.replaceAll :
Tenga en cuenta que primero
*
es codicioso, por lo que capturará la mayor cantidad de caracteres posibles y luego solo quedará el último punto y la extensión del archivo.fuente
.replaceAll(".*\\.", "")
devolver ".txt"
si solo quieres "txt", haz
path.lastIndexOf(".") + 1
fuente
Como es obvio por todas las otras respuestas, no existe una función "incorporada" adecuada. Este es un método seguro y simple.
fuente
¿Qué tal (usando Java 1.5 RegEx):
fuente
Si planea usar Apache commons-io, y solo desea verificar la extensión del archivo y luego hacer alguna operación, puede usar esto , aquí hay un fragmento:
fuente
Aquí hay otro one-liner para Java 8.
Funciona de la siguiente manera:
fuente
¿Qué tal JFileChooser? No es sencillo, ya que tendrá que analizar su salida final ...
que es un tipo MIME ...
OK ... Olvidé que no quieres saber su tipo MIME.
Código interesante en el siguiente enlace: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html
Pregunta relacionada: ¿Cómo recorto una extensión de archivo de una cadena en Java?
fuente
Aquí hay un método que se maneja
.tar.gz
correctamente, incluso en una ruta con puntos en los nombres de directorio:afterLastSlash
está creado para que la búsqueda seaafterLastBackslash
más rápida ya que no tendrá que buscar en toda la cadena si hay algunas barras.El
char[]
interior del originalString
se reutiliza, no agrega basura allí, y la JVM probablemente notará queafterLastSlash
es basura inmediatamente para colocarlo en la pila en lugar del montón .fuente
getExtension
función. Si el nombre del archivo del usuario es"my zip. don't touch.tar.gz"
, este método devolverá la extensión incorrecta.la extensión debería tener ".txt" cuando se ejecute.
fuente
Aquí está la versión con Opcional como valor de retorno (porque no puede estar seguro de que el archivo tenga una extensión) ... también verificaciones de cordura ...
fuente
¿Qué tal la versión REGEX :
o con extensión nula compatible:
resultado para * nix:
ruta: / root / docs /
name: readme
Extensión: txt
para Windows, parsePath ("c: \ windows \ readme.txt"):
ruta: c: \ windows \
name: readme
Extensión: txt
fuente
fuente
Aquí hice un método pequeño (sin embargo, no es tan seguro y no comprueba muchos errores), pero si solo usted está programando un programa general de Java, esto es más que suficiente para encontrar el tipo de archivo. Esto no funciona para tipos de archivo complejos, pero normalmente no se usan tanto.
fuente
lastIndexOf
para que los nombres de archivo comojohn.smith.report.doc
se traten correctamente. (2) Debe manejar adecuadamente los casos cuando no hay extensión. Este método devuelveABC/XYZ
una ruta comoabc/xyz
, que no tiene ningún sentido. Tendría más sentido volver""
onull
. (3) El separador de archivos no siempre es así/
.Obtener extensión de archivo del nombre de archivo
Créditos
fuente
Sin el uso de ninguna biblioteca, puede usar el método String dividido de la siguiente manera:
fuente
Solo una alternativa basada en expresiones regulares. No tan rápido, no tan bueno.
fuente
Encontré una mejor manera de encontrar extensiones combinando todas las respuestas anteriores
fuente
Me gusta la simplicidad de la respuesta de Spectre , y en uno de sus comentarios hay un enlace a otra respuesta que corrige los puntos en las rutas de los archivos, en otra pregunta, realizada por EboMike .
Sin implementar algún tipo de API de terceros, sugiero:
Algo como esto puede ser útil, por ejemplo, en cualquiera de los
write
métodos de ImageIO , donde se debe pasar el formato de archivo.¿Por qué utilizar una API de terceros completa cuando puedes hacer bricolaje?
fuente
Esta pregunta en particular me dio muchos problemas, entonces encontré una solución muy simple para este problema que estoy publicando aquí.
Eso es.
fuente
prueba esto.
fuente
fuente
Java tiene una forma integrada de lidiar con esto, en la clase java.nio.file.Files , que puede funcionar para sus necesidades:
Tenga en cuenta que este método estático utiliza las especificaciones que se encuentran aquí para recuperar el "tipo de contenido", que puede variar.
fuente