2010-01-27 9 views
8

ich nicht nur eine Datei lesen kann, wenn Datenbanknamen wie (neue Datenbank (myid enthalten) usw. ich einem folgenden Beispielcode geben: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); 
    } 

meine Datenbank Angenommen Name de mo bedeutet, wenn ich Zeile drucken bekam ich Datenbanknamen wie de nur. möglich ist, wenn Datenbankname mit dem leeren Raum?

Antwort

15

Sind Sie vertraut mit dem exec doppelten Anführungszeichen Bug?(Für Runtime.exec oder ProcessBuilder)

Sie können versuchen:

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

So stellen Sie sicher, dass keine Ihrer Parameter müssen Sie passieren enthält doppelte Anführungszeichen (während nicht mit doppelten Anführungszeichen beginnen)
(siehe bug 6511002)

Alle Parameter wie:

mykey="my value with space" 

würde intern (durch die getRuntime() Implementierung) in

"mykey="myvalue with space"" 

geändert werden, wenn dies der Fall ist, würden Sie das Argument tokenize brauchen:

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

Es scheint mysqldump Syntax ein wenig anders ist. Unten ist mein Arbeitsbeispiel mysqldump -h mysserver -u root -p mein_db -R> create_db.sql Ich denke du solltest uns e "" oder "` für komplexe Namen (habe mich selbst nicht überprüft).

0

Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe, aber Ihr dumpCommand scheint alle Variablen (hostName, user, databaseName) zu einer großen Zeichenfolge zu verbinden.

Machen Sie eine System.out.println (dumpCommand); und schauen Sie, ob Sie das wirklich ausführen wollen.

Vermutlich vermissen Sie hier einige Leerzeichen.

Wenn das "-" selbst ein Problem ist, möchten Sie vielleicht entkommen, sonst wird mysqldump denken, dass es ein Parameter ist.

2

Java und das Betriebssystem müssen wissen, was der Befehl ist und was die Argumente sind. Also:

1) Sie können versuchen, exec(String, String[]) zu verwenden, um die cmd bereitzustellen und die args durch separate

2) Sie können den mysqldump Befehl einschließen und jedes Argument in doppelte Anführungszeichen für die OS ihre einzelnen Dinge zu wissen.

Wenn Sie die Option (1) verwenden, erhält das Programm mysqldump ein Argument nach Element im Array, unabhängig von den Leerzeichen oder was auch immer.

2

Der Dateipfad enthält Leerzeichen, dies kann (eines der) Probleme sein. Versuchen Sie stattdessen:

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

und phisch der suggstion folgen das dumpCommand String drucken überprüfen zu verdoppeln, dass es ein gültiger mysqldump Anruf ist