código eficiente, es lo que quieres decir, espero, no en cuanto a CPU
mkoryak
3
No preguntaba cómo hacerlo, preguntaba cuál era la forma más eficiente. Vine aquí buscando lo mismo.
Edward Falk
Respuestas:
285
Este es el tipo de código que no deberíamos estar haciendo nosotros mismos. Usa bibliotecas para las cosas mundanas, guarda tu cerebro para las cosas difíciles.
Para el 95% de los proyectos, esta debería ser la respuesta aceptada. ¡Reescribir código como este es la causa de muchos dolores de cabeza!
Carsten Hoffmann
1
Simplemente agregue la siguiente línea en gradle para agregar la dependencia: - compile 'commons-io: commons-io: 2.6'
Deepak Sharma
ejemplo por favor.
John Ktejik
8
Si ya tiene Apache Commons I / O en su proyecto, está bien. Pero si esto es todo lo que necesita, está agregando (al menos) 2.5 MB de peso muerto a su proyecto para algo que se puede hacer fácilmente con una sola línea.
if (str! = nulo && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils es otra dependencia, y no siempre está disponible
ocramot
88
Como usar el String.substringy String.lastIndexen un one-liner es bueno, hay algunos problemas en términos de poder hacer frente a ciertas rutas de archivo.
Tome por ejemplo la siguiente ruta:
a.b/c
Usar el one-liner dará como resultado:
a
Eso es incorrecto
El resultado debería haber sido c, pero dado que el archivo carecía de una extensión, pero la ruta tenía un directorio con un .nombre, el método de una línea fue engañado para que diera parte de la ruta como nombre de archivo, lo cual no es correcto.
Para recrear su comportamiento, escribí algunas pruebas que el nuevo método debería cumplir, que son las siguientes:
Nombre de archivo de ruta
-------------- --------
a / b / cc
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg
ab / cc
ab / c.jpg c
ab / c.jpg.jpg c.jpg
cc
c.jpg c
c.jpg.jpg c.jpg
(Y eso es todo lo que he verificado, probablemente haya otras comprobaciones que deberían estar en su lugar que he pasado por alto).
La implementación
La siguiente es mi implementación para el removeExtensionmétodo:
Ejecutar este removeExtensionmétodo con las pruebas anteriores produce los resultados enumerados anteriormente.
El método fue probado con el siguiente código. Como esto se ejecutó en Windows, el separador de ruta es un elemento \que debe escaparse con un \cuando se usa como parte de un Stringliteral.
No, puede haber más de un '.'; quieres lastIndexOf ('.')
Adam Jaskiewicz
-1 por no usar el método que pensé que estabas usando. Eso es ahora un total de +0 de mi parte. ¡Cámbialo rápido! ;)
Michael Myers
7
String fileName="foo.bar";int dotIndex=fileName.lastIndexOf('.');if(dotIndex>=0){// to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);}
¿Es esta una pregunta con trampa? :pags
No puedo pensar en un cajero automático más rápido.
Use un método en com.google.common.io.Filesclase si su proyecto ya depende de la biblioteca principal de Google. El método que necesitas es getNameWithoutExtension.
Esto transformará "a.jpg.jpg" en "a" en lugar del (correcto) "a.jpg". ¿Para qué sirve el file.length() > 0cheque?
Klaus Gütter
La pregunta principal era "¿cómo eliminar la extensión?", Así que sí, transforma "a.txt.zip" en "a" y ".htaccess" en el vacío. Esta función funciona con cadenas, por lo que los nombres de los archivos no pueden ser nulos pero aún pueden tener una longitud de 0, verifique más rápidamente si vale la pena antes de analizar los símbolos. Saludos.
Respuestas:
Este es el tipo de código que no deberíamos estar haciendo nosotros mismos. Usa bibliotecas para las cosas mundanas, guarda tu cerebro para las cosas difíciles.
En este caso, recomiendo usar FilenameUtils.removeExtension () de Apache Commons IO
fuente
fuente
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Como usar el
String.substring
yString.lastIndex
en un one-liner es bueno, hay algunos problemas en términos de poder hacer frente a ciertas rutas de archivo.Tome por ejemplo la siguiente ruta:
Usar el one-liner dará como resultado:
Eso es incorrecto
El resultado debería haber sido
c
, pero dado que el archivo carecía de una extensión, pero la ruta tenía un directorio con un.
nombre, el método de una línea fue engañado para que diera parte de la ruta como nombre de archivo, lo cual no es correcto.Necesidad de cheques
Inspirado por la respuesta de skaffman , eché un vistazo al
FilenameUtils.removeExtension
método de Apache Commons IO .Para recrear su comportamiento, escribí algunas pruebas que el nuevo método debería cumplir, que son las siguientes:
(Y eso es todo lo que he verificado, probablemente haya otras comprobaciones que deberían estar en su lugar que he pasado por alto).
La implementación
La siguiente es mi implementación para el
removeExtension
método:Ejecutar este
removeExtension
método con las pruebas anteriores produce los resultados enumerados anteriormente.El método fue probado con el siguiente código. Como esto se ejecutó en Windows, el separador de ruta es un elemento
\
que debe escaparse con un\
cuando se usa como parte de unString
literal.Los resultados fueron:
Los resultados son los resultados deseados descritos en la prueba que el método debe cumplir.
fuente
System.getProperty("file.separator")
y no soloFile.separator
?/path/to/.htaccess
Por cierto, en mi caso, cuando quería una solución rápida para eliminar una extensión específica, esto es aproximadamente lo que hice:
fuente
fuente
¿Es esta una pregunta con trampa? :pags
No puedo pensar en un cajero automático más rápido.
fuente
Use un método en
com.google.common.io.Files
clase si su proyecto ya depende de la biblioteca principal de Google. El método que necesitas esgetNameWithoutExtension
.fuente
puedes probar esta función, muy básica
fuente
He encontrado la respuesta de coolbird particularmente útil.
Pero cambié las últimas declaraciones de resultados a:
ya que quería que se devolviera el nombre completo de la ruta.
fuente
fuente
Usa una expresión regular. Este reemplaza el último punto, y todo lo que sigue.
También puede crear un objeto Patrón si desea precompilar la expresión regular.
fuente
fuente
"\\."
como "." Es especial para expresiones regulares.crear un nuevo archivo con ruta de imagen de cadena
fuente
org.apache.commons.io.FilenameUtils versión 2.4 da la siguiente respuesta
fuente
fuente
Me gustaría hacer esto:
Comenzando hasta el final hasta el '.' luego llame a la subcadena.
Editar: Puede que no sea un golf pero es efectivo :)
fuente
Teniendo en cuenta los escenarios donde no hay extensión de archivo o hay más de una extensión de archivo
ejemplo Nombre de archivo: archivo | file.txt | file.tar.bz2
fuente
Esto generará ejemplos para img e imgLink
fuente
fuente
file.length() > 0
cheque?