2009-09-14 8 views
1

J'essaie d'entrer une valeur dans une application externe en utilisant Java.Java - entrée de passe dans l'application externe C/C++

application Java ressemble à ceci:

Runtime runtime = Runtime.getRuntime(); 
// ... str build ... 
proc = runtime.exec(str); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 
bw.write(value); 
bw.flush(); 
bw.close(); 
if (proc.waitFor() != 0) 
    // error msg 
// the end 

application se bloque à la méthode waitFor.

L'application externe ressemble à ceci:

welcome banner 

please enter 8 character input: 

bannière de bienvenue est imprimé à l'aide printf et l'entrée est prise avec SetConsoleMode/ReadConsoleInput. ReadConsoleInput lit un caractère et ils sont masqués avec un caractère *.

Aide

Répondre

0

obtenu la réponse! L'astuce consiste à utiliser l'API WriteConsoleInput() car le programme attend un événement de clavier, pas de texte ... C'est pourquoi waitFor() a attendu pour toujours! :)

2

vous pouvez utiliser:

proc.getOutputStream().write("some date".getBytes()) 

garder à l'esprit que vous devez lire tout l'application envoyer à stdout et stderr, sinon il pourrait y arriver par écrit coincé. J'utilise une classe générique pour la lire dans un thread différent. l'utilisation est comme:

InputStreamSucker inSucker = new InputStreamSucker(proc.getInputStream()); 
InputStreamSucker errSucker = new InputStreamSucker(proc.getErrorStream()); 
proc.waitFor(); 
int exit = process.exitValue(); 
inSucker.join(); 
errSucker.join(); 

code InputStreamSucker est ici:

public class InputStreamSucker extends Thread 
{ 
    static Logger logger = Logger.getLogger(InputStreamSucker.class); 

    private final BufferedInputStream m_in; 

    private final ByteArrayOutputStream m_out; 

    private final File m_outFile; 

    public InputStreamSucker(InputStream in) throws FileNotFoundException 
    { 
     this(in, null); 
    } 


    public InputStreamSucker(InputStream in, File outFile) throws FileNotFoundException 
    { 
     m_in = new BufferedInputStream(in, 4096); 
     m_outFile = outFile; 
     m_out = new ByteArrayOutputStream(); 
     start(); 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      int c; 
      while ((c = m_in.read()) != -1) 
      { 
       m_out.write(c); 
      } 
     } 
     catch (IOException e) 
     { 
      logger.error("Error pumping stream", e); 
     } 
     finally 
     { 
      if (m_in != null) 
      { 
       try 
       { 
        m_in.close(); 
       } 
       catch (IOException e) 
       { 
       } 
      } 

      try 
      { 
       m_out.close(); 
      } 
      catch (IOException e) 
      { 
       logger.error("Error closing out stream", e); 
      } 

      if (m_outFile != null) 
      { 
       byte data[] = m_out.toByteArray(); 
       if (data.length > 0) 
       { 
        FileOutputStream fo = null; 
        try 
        { 
         fo = new FileOutputStream(m_outFile); 
         fo.write(data); 
        } 
        catch (IOException e) 
        { 
         logger.error("Error writing " + m_outFile); 
        } 
        finally 
        { 
         try 
         { 
          if (fo != null) fo.close(); 
         } 
         catch (IOException e) 
         { 
          logger.error("Error closing " + m_outFile); 
         } 
        } 
       } 
      } 
     } 
    } 

    public String getOutput() 
    { 
     return new String(m_out.toByteArray()); 
    } 
} 
+0

Omry, l'ordre est-il important? Je devrais d'abord lire le flux d'entrée/erreur, puis écrire? –

+0

Omry, merci pour le code, je l'ai essayé, mais ça colle toujours à waitFor. –

+0

Eh bien, si votre processus attend une entrée, vous devriez le fournir. vous pouvez pirater mon code pour imprimer sur System.out, ainsi vous verrez ce qui se passe avec votre processus. vous pouvez également juste terminer le fichier journal. assurez-vous d'utiliser proc.getOutputStream(). Write() pour envoyer des données à votre processus. –

Questions connexes