2010-04-01 5 views
5

Je veux exécuter des scripts SQL en utilisant la méthode Runtime.exec de Java. J'ai l'intention d'invoquer mysql.exe/mysql.sh et de rediriger le fichier script vers ce processus. À l'invite de commande que je peux exécuter la commandecomment rediriger stdin à java Runtime.exec?

<mysqInstallDir\/bin\mysql.exe -u <userName> -p <password> < scripts\create_tables.sql 

je peux appeler à l'aide mysql.exe Runtime.exec mais comment puis-je rediriger les données du fichier sql à mysql.exe?


J'ai lu l'article dans http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 et utilisé le mécanisme de StreamGobbler pour obtenir l'erreur et de sortie. Pas de problème là-bas. Le problème vient en lisant le fichier "scripts \ create_tables.sql" en utilisant BufferedReader et en passant le contenu au flux de sortie de prcess. Je m'attendais à ce que le processus transmette les données au fichier mysql.exe. Mais je vois que seule la première ligne est lue depuis ce fichier sql. Lorsque je fais cela, je vois que seule la première ligne de create_tables.sql est exécutée. Le code de sortie pour le processus est 0 et il n'y a pas d'erreur ou de sortie.

Répondre

5

Exec vous renvoie un objet Process.

Le processus a les méthodes getInputStream et getOutputStream. Il suffit d'utiliser ceux-ci pour attraper le flux d'entrée et commencer à y introduire des octets. Ne pas oublier de lire le flux de sortie ou le processus peut bloquer.

+0

Et le flux d'erreur, bien sûr. Ou fusionnez les flux de sortie et d'erreur avec la méthode redirectErrorStream (boolean) de ProcessBuilder et lisez les flux fusionnés. –

1

La redirection est une fonctionnalité des environnements shell/cmd du système d'exploitation. Pour les appeler correctement, nous devrions utiliser Runtime.exec (String []) au lieu de Runtime.exec (String). Voici le code.

public Result executeCmd(String[] cmds, boolean waitForResult) 
{ 
    Result result = new Result(); 
    result.output = ""; 
    try 
    { 
     for(int i=0;i<cmds.length;i++) 
     { 
      System.out.println("CMD["+i+"]::"+cmds[i]); 
     } 
     System.out.println(""); 
     Process process = null; 
     if(cmds.length > 1) 
      process=Runtime.getRuntime().exec(cmds); 
     else 
      process=Runtime.getRuntime().exec(cmds[0]); 
     if (waitForResult) 
     { 
      StreamGobbler errordataReader = new StreamGobbler(process 
        .getErrorStream(), "ERROR"); 

      StreamGobbler outputdataReader = new StreamGobbler(process 
        .getInputStream(), "OUTPUT"); 

      errordataReader.start(); 
      outputdataReader.start(); 

      int exitVal = process.waitFor(); 
      errordataReader.join(); 
      outputdataReader.join(); 
      result.returnCode = exitVal; 
      result.output = outputdataReader.output; 
      result.error = errordataReader.output; 
     } 
    } 
    catch (Exception exp) 
    { 
     result.exp = exp; 
     result.returnCode = -1; 
    } 
    return result; 
} 

Et appeler cette méthode en utilisant

Result result = executeCmd(cmds, true); 

CMD[0]::cmd 
CMD[1]::/c 
CMD[2]::.\mysql\bin\mysql --host=<hostname> --port=<portNum> -u <userName> < .\scripts\create_tables.sql 
Questions connexes