2012-04-26 18 views
14

Tengo una ruta de archivo completa y deseo obtener el nombre del archivo.División de nombres de archivo con el símbolo del separador de archivos del sistema

estoy usando la siguiente instrucción:

String[] splittedFileName = fileName.split(System.getProperty("file.separator")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 

Pero en Windows Da:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 
\ 
^ 

puedo evitar esta excepción? ¿Hay una mejor manera de hacer esto?

Respuesta

34

El problema es que \ tiene que ser escapado para usarlo como una barra invertida dentro de una expresión regular. Usted debe utilizar un splitting API which doesn't use regular expressions, o utilizar Pattern.quote primera:

// Alternative: use Pattern.quote(File.separator) 
String pattern = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(pattern); 

O mejor aún, utilizar la API para este File:

File file = new File(fileName); 
String simpleFileName = file.getName(); 
3

Cuando se escribe un nombre de archivo, se debe utilizar System.getProperty("file.separator").

Cuando lee un nombre de archivo, es posible que tenga la barra inclinada hacia adelante o la barra hacia atrás como separador de archivos.

Es posible que desee probar el siguiente:

fileName = fileName.replace("\\", "/"); 
String[] splittedFileName = fileName.split("/")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
+0

Gracias @Gilbert Le Blanc, buen pedazo de código! simple y funciona genial! –

0

En primer lugar, para este problema concreto me gustaría recomendar el uso de la clase java.util.File en lugar de una expresión regular.

Dicho esto, la raíz del problema al que se está enfrentando es que la barra invertida '\' significa una secuencia de escape en las expresiones regulares de Java. Lo que está sucediendo es que el analizador de expresiones regulares está viendo la barra diagonal inversa y espera que haya otro personaje después que complete la secuencia de escape. La forma más sencilla de evitar esto es usar el método java.util.regex.Pattern.quote(), que escapará a cualquier carácter especial en la cadena que le proporcione.

Con este cambio, el código se convierte en:

String splitRegex = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(splitRegex); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
2

Otra forma más simple podría ser hacer

File f = new File(path); 
String fileName = f.getName(); 

Creo que esto va a funcionar siempre y cuando los caminos son compatibles con la plataforma, es decir, no está seguro de si la ruta "c: \ archivo.txt" funcionará en Linux o no.

Cuestiones relacionadas