Java: Problemas de contrabarra

Para el Proyecto tengo que hacer unas llamadas a R, el programa de análisis estadísticos, desde Java. Uno de los comandos que le ordeno es que lea un fichero de texto CSV donde se encuentran las entradas y salidas. En R, simplemente:

basedatos<-read.table("/home/ender/iris.csv",sep=";",header=TRUE,dec=",")

Para lanzarlo desde Java, sería (JFileChooser explorador, String sep=»;», String dec=»,»):

re.eval("basedatos<-read.table(\"" + explorador.getFile().getAbsolutePath() + "\",sep=\"" + sep + "\",header=TRUE,dec=\"" + dec + "\")");

He estado todo este tiempo programando desde Linux y no había tenido ningún problema, pero dado que Java es multiplataforma, me dediqué ayer a preparar el resto de programas (R y JRI, la librería que permite la comunicación mediante JNI desde Java) para poder usarlo desde Windows. Y el caso es que me daba error.

Imaginé en seguida que sería problema de las rutas y, efectivamente, R no acepta las direcciones con la contrabarra, tal y como se dan en Windows. Para solucionarlo, obviamente, no hay mas que cambiar todas las contrabarras por barras, para lo cual hay un comando que implementa todo String:

path = path.replaceAll("\\","/");

Recordemos que la contrabarra es utilizado como carácter de escape para caracteres que no tienen representación gráfica (intro, tabulado, etcétera) de modo que hay que «escaparla» poniendola dos veces. Pues no funciona. Por algún motivo Java no lo reconoce como String, sin embargo existe otro método para caracteres con el que funciona correctamente.

path = path.replace('\\','/'));

He hecho un par de pruebas y no sé qué miedo le tiene a las contrabarras como String, porque algo como:

String aux = "albaricoque/gemir/susurro/sociedad";
System.out.println(aux.replaceAll("/","."));
aux = "albaricoque\\gemir\\susurro\\sociedad";
System.out.println(aux);
System.out.println(aux.replaceAll("\\s","."));
System.out.println(aux.replace('\\',','));
System.out.println(aux.replaceAll("\\",","));

Devuelve por pantalla:

albaricoque.gemir.susurro.
albaricoque\gemir\susurro\sociedad
albaricoque\gemir\susurro\sociedad
albaricoque,gemir,susurro,sociedad
Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
^

Aquí se ve que la barra como String es reconocida sin problemas, pero no la contrabarra, que de hecho lanza una expcepción. He pensado que al ser un carácter de control pueda no funcionar correctamente sólo, por lo que he probado que modifique las \s por puntos, pero no cambia nada.

Echando un vistazo en Google, en un foro dan una solución, pero no entiendo por qué hay que codificarlo así:
System.out.println(aux.replaceAll("\\\\","."));
albaricoque.gemir.susurro.sociedad

¡Cuatro barras para que encuentre una!

Únete a la conversación

3 comentarios

  1. Uhiva…tu sitio web ya funciona…como spammer bot que soy comprobare rutinariamente (bonito palabro) el lugar para ver si puedo dejar comentarios sobre mi maravilloso farmaco que enlarga tu penis…powercloking

  2. ¡Hola! Para que no surjan esos problemas con los strings de las rutas, lo mejor es no concatenar directamente las barras separadoras, si no utilizar File.separator.

    Así, el programa se encarga de concatenar el carácter adecuado según la plataforma en la que se ejecute, ya sea Windows o Unix.

    En lugar de + «\» + …
    utilizas + File.separator + …

    ¡Espero que te sea útil! Un saludo :)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *