2011-02-06 12 views
15

¿Cómo puedo ejecutar un comando del Sistema Java (shell) que tiene un espacio en el nombre de ruta?Java ejecuta un comando con un espacio en el nombre de ruta

He intentado poner comillas y una barra diagonal inversa(), pero no funciona.

ln -s "dir1/dir2" "my\ dir/dir2" 
+0

' "mi \ dir/directorio2"' no es una cadena válida en Java porque ' "\" 'es no es una secuencia de escape válida Pruebe '" my \\ dir/dir2 "'. –

+0

No, ese es el resultado cuando imprimo en la cadena. Ya estoy usando "\\" – LanguagesNamedAfterCofee

+0

Ah, está bien. Eso no estaba claro. ¿Estás usando OS X por casualidad? http://stackoverflow.com/questions/697621/ –

Respuesta

24

De lejos, la manera más confiable es usar Runtime.exec(String[] cmdarray).

Si usa Runtime.exec(String command), Java solo divide el comando en espacios en blanco.

la cadena de comandos se divide en tokens utilizando un StringTokenizer creado por la llamada nueva StringTokenizer (comando) sin modificaciones adicionales de las categorías de caracteres. Los tokens producidos por el tokenizer se colocan en la nueva matriz de matriz cmdarray, en el mismo orden.

Ver también g++: File not found

O utilice ProcessBuilder algo como esto:

ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2"); 
Process p = pb.start(); 
+6

ProcessBuilder es la forma recomendada, ya que puede tratar con espacios mucho mejores que Runtime.exec() –

+0

De hecho, acabo de agregar un ejemplo usando ProcessBuilder basado en Javadocs. Te parece bien? – Mikel

+1

Intenté usar esto, pero todavía no funciona. ¿Debo especificar la ruta completa al ejecutable? – LanguagesNamedAfterCofee

6

lo que realmente necesita para ejecutarlo en un shell (por ejemplo, qué necesita para bombardear expansión de las cosas como ~ o *, etc.)? Si no, usted podría invocar ln directamente:

Process p = 
    Runtime.getRuntime() 
    .exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"}); 

Si realmente necesita una concha, probar este (esto puede necesitar un poco de ajuste en función de cómo procesa la cáscara de las comillas):

Process p = 
    Runtime.getRuntime() 
    .exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""}); 

Editar:

Tenía la impresión de que el segundo camino tiene una barra invertida literal. Si no se supone que debe eliminar el \\ de los literales de cadena de arriba.

1

Ninguno de estos trabajos en Lion. Sin embargo, lo siguiente funciona, y es compatible con versiones anteriores para Tiger.

Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"}); 
0

Se puede utilizar de la siguiente manera sin tener que introducir cualquier barra invertida: Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});

Cuestiones relacionadas