2010-01-27 4 views
8

Non riesco a leggere un file solo quando il nome del database contiene come (nuovo database (myid) ecc do un codice di esempio seguente:Runtime.getRuntime() exec()

dumpCommand = "C:/Program Files/MySQL/MySQL Server 5.0/bin/mysqldump -h"+hostName+user+databaseName; 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(dumpCommand);      
InputStream in = proc.getInputStream();    
BufferedReader br=new BufferedReader(new InputStreamReader(in)); 
String line =null; 

while((line=br.readLine())!=null) 
{ 
//able to read line only when database name like abc,datastore etc... 
System.out.println(line); 
    } 

Supponiamo mio database nome de mo significa che quando si stampa linea ho ottenuto il nome del database come de solo. è possibile quando il nome del database con lo spazio vuoto?

risposta

15

Sei familiarità con il bug exec virgolette?(Per Runtime.exec o ProcessBuilder)

Si può provare:

Runtime.getRuntime().exec(new String[] { 
    "\"C:/Program Files/MySQL/MySQL Server 5.0/bin/mysqldump\"", 
    "-h", 
    hostName+user+databaseName}); 

Basta assicurarsi che nessuno dei vostri parametri si dovrà passare contiene virgolette doppie (mentre non che inizia con le doppie virgolette)
(vedi bug 6511002)

Qualsiasi parametro come:

mykey="my value with space" 

sarebbe cambiato internamente (dal getRuntime() implementazione) in

"mykey="myvalue with space"" 

Se questo è il caso, si avrebbe bisogno di tokenize l'argomento:

{"mykey=\"my\"" , "\"value with space\""} 
0

Sembra mysqldump sintassi è un po 'diverso. Qui di seguito è il mio esempio di lavoro mysqldump -h mysserver -u root -p my_db -R> create_db.sql Penso che dovresti e "" o `` per i nomi complessi (non ho controllato me stesso).

0

Non sono sicuro di aver capito la tua domanda in modo completo, ma il tuo dumpCommand sembra concatenare tutte le variabili (hostName, user, databaseName) a una grande stringa.

Fare un System.out.println (dumpCommand); e vedere se questo è ciò che si vuole veramente eseguire.

Probabilmente qui mancano alcuni spazi.

Se il "-" stesso è un problema, si potrebbe volerlo scappare, altrimenti mysqldump penserà che sia un parametro.

2

Java e il sistema operativo devono sapere qual è il comando e quali sono gli argomenti. Quindi:

1) Si può provare a utilizzare exec(String, String[]) per fornire il cmd e args da separato

2) È possibile racchiudere il comando mysqldump e ogni argomento in virgolette doppie per il sistema operativo di conoscere le loro cose singoli.

Se si utilizza l'opzione (1), il programma mysqldump riceverà un argomento per elemento nell'array, indipendentemente dagli spazi o da qualsiasi altra cosa.

2

Il percorso del file contiene spazi vuoti, che possono essere (uno dei) problemi. Prova a modificare:

dumpCommand = "\"C:/Program Files/MySQL/MySQL Server 5.0/bin/mysqldump\" -h" 
       +hostName+user+databaseName; 

e seguire suggstion di phisch per stampare la stringa dumpCommand di verificare che si tratta di un mysqldump chiamata valida