Si usted, como yo, prefiere usar algún código de biblioteca donde probablemente hayan pensado en todos los casos especiales, como lo que sucede si pasa puntos o nulos en la ruta pero no en el nombre del archivo, puede usar lo siguiente:
también puede usar FilenameUtils.getBasename para ir directamente de una cadena de ruta a un nombre de archivo sin extensión.
Ian Durkan
2
Lo más fácil es, por supuesto, ejecutar maven :-) De lo contrario, ver: commons.apache.org/io
Ulf Lindback
8
Para aquellos que prefieren la guayaba, también puede hacer esto . (En estos días, personalmente no me siento muy bien al agregar dependencias de Apache Commons, aunque históricamente esas bibliotecas han sido muy útiles.)
Jonik
3
Si bien Guava y Commons-IO pueden ofrecer un poco más, se sorprenderá de cuántos métodos de conveniencia ya están incluidos en JDK 7 con java.nio.file.Filesy Path, como resolver directorios base, copiar / mover archivos en una línea, obtener solo el nombre del archivo etc.
Don Cheadle
3
@Lan Durkan actualmente FilenameUtils.getBaseName con N mayúscula
Regex no es tan fácil de usar como la solución de biblioteca anterior. Funciona, pero mirar el código (sin tener que interpretar el REGEX) no es obvio lo que hace.
Gustavo Litovsky
55
@GustavoLitovsky Android no viene incluido org.apache.commons. Que yo sepa, esta es la única forma de hacerlo en Android.
Liam George Betsworth
1
/ * la siguiente expresión regular también elimina la ruta * / "/the/path/name.extension".replaceAll(".*[\\\\/font>|\\.[^\\.font>*$", "") ;
daggett
1
Agregaría barras a la segunda clase de caracteres para asegurarme de que no te tropieces con un camino como "/foo/bar.x/baz"
chrisinmtown
53
Vea el siguiente programa de prueba:
publicclass javatemp {staticString stripExtension (String str){// Handle null case specially.if(str ==null)returnnull;// Get position of last '.'.int pos = str.lastIndexOf(".");// If there wasn't any '.' just return the string as is.if(pos ==-1)return str;// Otherwise return the string, up to the dot.return str.substring(0, pos);}publicstaticvoid main(String[] args){System.out.println ("test.xml -> "+ stripExtension ("test.xml"));System.out.println ("test.2.xml -> "+ stripExtension ("test.2.xml"));System.out.println ("test -> "+ stripExtension ("test"));System.out.println ("test. -> "+ stripExtension ("test."));}}
que salidas:
test.xml -> test
test.2.xml -> test.2
test -> test
test. -> test
¿Cuál es la extensión de foo.tar.gz? Puedo ver por qué .tar.gzsería lo que querrías.
tchrist
55
@tchrist, foo.tar.gzes una versión comprimida de, foo.tarpor lo que también podría argumentar que esa gzera la extensión. Todo se reduce a cómo define la extensión.
paxdiablo
2
¿Qué hacer con los archivos .gitignore?
michael nesterenko
como sabes, el nombre de la clase en java nunca debe comenzar con letras minúsculas.
AnujKu
77
Si eso fuera una regla, el lenguaje lo haría cumplir. Como no es así, es una guía, aunque se sugiere encarecidamente. En cualquier caso, eso es totalmente irrelevante para la pregunta y la respuesta.
paxdiablo
47
Aquí está el orden de la lista consolidada por mi preferencia.
Usando apache commons
import org.apache.commons.io.FilenameUtils;String fileNameWithoutExt =FilenameUtils.getBaseName(fileName);
OR
String fileNameWithOutExt =FilenameUtils.removeExtension(fileName);
String fileName = file.getName();int pos = fileName.lastIndexOf(".");if(pos >0&& pos <(fileName.length()-1)){// If '.' is not the first or last character.
fileName = fileName.substring(0, pos);}
(Esencialmente lo mismo que FilenameUtils.removeExtension()de Apache Commons IO, como sugiere la respuesta más votada . Solo quería señalar que Guava hace esto también. Personalmente no quería agregar dependencia a Commons, lo cual creo que es un poco una reliquia) solo por esto)
/**
* Gets the base name, without extension, of given file name.
* <p/>
* e.g. getBaseName("file.txt") will return "file"
*
* @param fileName
* @return the base name
*/publicstaticString getBaseName(String fileName){int index = fileName.lastIndexOf('.');if(index ==-1){return fileName;}else{return fileName.substring(0, index);}}
Si bien creo firmemente en la reutilización de bibliotecas, el org.apache.commons.io JAR es 174 KB, que es notablemente grande para una aplicación móvil.
Si descarga el código fuente y echa un vistazo a su clase FilenameUtils, puede ver que hay muchas utilidades adicionales, y hace frente a las rutas de Windows y Unix, lo cual es encantador.
Sin embargo, si solo desea un par de métodos de utilidad estática para usar con rutas de estilo Unix (con un separador "/"), puede encontrar útil el siguiente código.
El removeExtensionmétodo conserva el resto de la ruta junto con el nombre del archivo. También hay un similar getExtension.
/**
* Remove the file extension from a filename, that may include a path.
*
* e.g. /path/to/myfile.jpg -> /path/to/myfile
*/publicstaticString removeExtension(String filename){if(filename ==null){returnnull;}int index = indexOfExtension(filename);if(index ==-1){return filename;}else{return filename.substring(0, index);}}/**
* Return the file extension from a filename, including the "."
*
* e.g. /path/to/myfile.jpg -> .jpg
*/publicstaticString getExtension(String filename){if(filename ==null){returnnull;}int index = indexOfExtension(filename);if(index ==-1){return filename;}else{return filename.substring(index);}}privatestaticfinalchar EXTENSION_SEPARATOR ='.';privatestaticfinalchar DIRECTORY_SEPARATOR ='/';publicstaticint indexOfExtension(String filename){if(filename ==null){return-1;}// Check that no directory separator appears after the // EXTENSION_SEPARATORint extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);if(lastDirSeparator > extensionPos){LogIt.w(FileSystemUtil.class,"A directory separator appears after the file extension, assuming there is no file extension");return-1;}return extensionPos;}
Puedes dividirlo por "." y en el índice 0 está el nombre del archivo y en 1 es la extensión, pero me inclinaría por la mejor solución con FileNameUtils de apache.commons-io como se mencionó en el primer artículo. No es necesario eliminarlo, pero es suficiente:
Puede usar la función de división de Java para dividir el nombre de archivo de la extensión, si está seguro de que solo hay un punto en el nombre de archivo para la extensión.
File filename = new File('test.txt');
File.getName().split("[.]");
así split[0]que devolverá "test" y split [1] devolverá "txt"
Prueba el siguiente código. Uso de funciones básicas de Java básicas. Se ocupa de Strings con extensión, y sin extensión (sin el '.'carácter). El caso de múltiples '.'también está cubierto.
String str ="filename.xml";if(!str.contains("."))System.out.println("File Name="+ str);else{
str = str.substring(0, str.lastIndexOf("."));// Because extension is always after the last '.'System.out.println("File Name="+ str);}
Es una práctica bastante mala implementar este tipo de funcionalidad usted mismo. A primera vista, la tarea parece ser extremadamente obvia , pero en la práctica se enfrentará a muchas situaciones excepcionales (como no hay .un nombre de archivo, o el archivo es una copia de seguridad y tiene un nombre como document.docx.backup, etc.). Es mucho más confiable usar una biblioteca externa que se ocupa de todas estas situaciones excepcionales para usted.
ivstas
1
Por otro lado, agregar muchas bibliotecas a su proyecto lo hará más grande. Entonces, cosas simples como esta podrían hacerse usted mismo.
Nicolas Tyler
1
De ninguna manera deberías hacerlo tú mismo. Esto es difícil: archivos sin extensión pero. en ruta, rutas ftp, ventanas y barras unix, enlaces simbólicos, etc. Sin duda, fallará y al tratar de ganar un poco de memoria, agregará mucha inestabilidad. Como mínimo, copie las fuentes del código establecido si las licencias lo permiten.
Jonathan Nappee
Este código se parece al de Amit Mishra, excepto por ese intimidante 'if (! Str.contains ("."))'
Broken_Window
fallaría en el siguiente caso "/someFolder/some.other.folder/someFileWithoutExtention". Lo primero que me vino a la mente después de 2 segundos ... estoy seguro de que podría encontrar muchos otros ejemplos.
Respuestas:
Si usted, como yo, prefiere usar algún código de biblioteca donde probablemente hayan pensado en todos los casos especiales, como lo que sucede si pasa puntos o nulos en la ruta pero no en el nombre del archivo, puede usar lo siguiente:
fuente
java.nio.file.Files
yPath
, como resolver directorios base, copiar / mover archivos en una línea, obtener solo el nombre del archivo etc.La forma más fácil es usar una expresión regular.
La expresión anterior eliminará el último punto seguido de uno o más caracteres. Aquí hay una prueba de unidad básica.
fuente
org.apache.commons
. Que yo sepa, esta es la única forma de hacerlo en Android.Vea el siguiente programa de prueba:
que salidas:
fuente
foo.tar.gz
? Puedo ver por qué.tar.gz
sería lo que querrías.foo.tar.gz
es una versión comprimida de,foo.tar
por lo que también podría argumentar que esagz
era la extensión. Todo se reduce a cómo define la extensión..gitignore
?Aquí está el orden de la lista consolidada por mi preferencia.
Usando apache commons
Usando Google Guava (si ya lo estás usando)
O usando Core Java
1)
2)
3)
API de Liferay
fuente
Si su proyecto usa guayaba (14.0 o más reciente), puede ir con
Files.getNameWithoutExtension()
.(Esencialmente lo mismo que
FilenameUtils.removeExtension()
de Apache Commons IO, como sugiere la respuesta más votada . Solo quería señalar que Guava hace esto también. Personalmente no quería agregar dependencia a Commons, lo cual creo que es un poco una reliquia) solo por esto)fuente
FilenameUtils.getBaseName()
A continuación se muestra una referencia de https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java
fuente
Si no desea importar los apache.commons completos, he extraído la misma funcionalidad:
fuente
Si bien creo firmemente en la reutilización de bibliotecas, el org.apache.commons.io JAR es 174 KB, que es notablemente grande para una aplicación móvil.
Si descarga el código fuente y echa un vistazo a su clase FilenameUtils, puede ver que hay muchas utilidades adicionales, y hace frente a las rutas de Windows y Unix, lo cual es encantador.
Sin embargo, si solo desea un par de métodos de utilidad estática para usar con rutas de estilo Unix (con un separador "/"), puede encontrar útil el siguiente código.
El
removeExtension
método conserva el resto de la ruta junto con el nombre del archivo. También hay un similargetExtension
.fuente
fuente
La forma más simple de obtener el nombre de la ruta relativa o la ruta completa es usar
import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)
fuente
Puedes dividirlo por "." y en el índice 0 está el nombre del archivo y en 1 es la extensión, pero me inclinaría por la mejor solución con FileNameUtils de apache.commons-io como se mencionó en el primer artículo. No es necesario eliminarlo, pero es suficiente:
String fileName = FilenameUtils.getBaseName("test.xml");
fuente
Uso
FilenameUtils.removeExtension
de Apache Commons IOEjemplo:
Puede proporcionar el nombre completo de la ruta o solo el nombre del archivo .
Espero que esto ayude ..
fuente
La forma fluida:
fuente
Manteniéndolo simple, use el método String.replaceAll () de Java de la siguiente manera:
Esto también funciona cuando fileNameWithExt incluye la ruta completa.
fuente
Puede usar la función de división de Java para dividir el nombre de archivo de la extensión, si está seguro de que solo hay un punto en el nombre de archivo para la extensión.
File filename = new File('test.txt'); File.getName().split("[.]");
así
split[0]
que devolverá "test" y split [1] devolverá "txt"fuente
Prueba el siguiente código. Uso de funciones básicas de Java básicas. Se ocupa de
String
s con extensión, y sin extensión (sin el'.'
carácter). El caso de múltiples'.'
también está cubierto.Puede adaptarlo para trabajar con
null
cadenas.fuente
.
un nombre de archivo, o el archivo es una copia de seguridad y tiene un nombre comodocument.docx.backup
, etc.). Es mucho más confiable usar una biblioteca externa que se ocupa de todas estas situaciones excepcionales para usted.