2010-01-27 5 views
8

Je ne peux pas lire un seul fichier lorsque le nom de base de données contient comme (nouvelle base de données (myid) etc. Je donne un exemple de code suivant: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); 
    } 

Supposons ma base de données nom de mo signifie que lorsque j'imprimer en ligne je suis arrivé nom de base de données comme de ne. est possible lorsque le nom de base de données avec un espace vide?

Répondre

15

Êtes-vous familier avec le bug guillemets exec?(Pour Runtime.exec ou ProcessBuilder)

Vous pouvez essayer:

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

Assurez-vous qu'aucun de vos paramètres, vous devrez passer contient des guillemets doubles (en pas en commençant par des guillemets doubles)
(Voir bug 6511002)

Tous les paramètres comme:

mykey="my value with space" 

serait changé interne (par la mise en œuvre getRuntime()) dans

"mykey="myvalue with space"" 

Si tel est le cas, vous devez tokenizer l'argument:

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

Il semble mysqldump syntaxe est un peu différent. Ci-dessous est mon exemple de travail mysqldump -h mysserver -u root -p my_db -R> create_db.sql Je pense que vous devriez nous e "" ou `` pour les noms complexes (ne m'ont pas vérifié).

0

Je ne sais pas si je comprends votre question dans son intégralité, mais votre dumpCommand semble concaténer toutes les variables (hostName, user, databaseName) en une grande chaîne.

Faire un System.out.println (dumpCommand); et voyez si c'est ce que vous voulez vraiment exécuter.

Il vous manque probablement des espaces ici.

Si le "-" lui-même est un problème, vous pourriez vouloir l'échapper, sinon mysqldump pensera que c'est un paramètre. Java et le système d'exploitation ont besoin de savoir quelle est la commande et quels sont les arguments.

2

Alors:

1) Vous pouvez essayer d'utiliser exec(String, String[]) pour fournir le cmd et les args par séparés

2) Vous pouvez joindre la commande mysqldump et chaque argument entre guillemets pour le système d'exploitation pour connaître leurs simples choses.

Si vous utilisez l'option (1), le programme mysqldump recevra un argument par élément dans le tableau, peu importe les espaces ou quoi que ce soit.

2

Le chemin du fichier contient des espaces, qui peuvent être l'un des problèmes. Essayez ceci:

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

et suivez la suggstion de phisch pour imprimer la dumpCommand chaîne pour vérifier qu'il est un appel mysqldump valide