Java - vorbei Eingabe in externen C / C ++ Anwendung
-
07-07-2019 - |
Frage
Ich versuche, einen Wert in der externen Anwendung mit Java einzugeben.
Java-Anwendung sieht wie folgt aus:
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
Anwendung hängt bei waitFor Methode.
Externe Anwendung sieht wie folgt aus:
welcome banner
please enter 8 character input:
Willkommen Banner werden mit gedruckt printf und Eingang mit SetConsoleMode / Read genommen. Read liest ein Zeichen und sie sind mit * Zeichen maskiert.
Hilfe
Lösung 2
Haben Sie die Antwort! Der Trick ist, WriteConsoleInput () API zu verwenden, da Programm Tastaturereignis erwartet, nicht Text ... Deshalb ist die waitFor () wartete für immer! :)
Andere Tipps
Sie verwenden können:
proc.getOutputStream().write("some date".getBytes())
im Auge behalten, die Sie haben, alles lesen die App auf stdout und stderr senden, sonst könnte es dort stecken schriftlich bekommen. Ich benutze eine generische Klasse in einem anderen Thread zu lesen. Nutzung ist wie:
InputStreamSucker inSucker = new InputStreamSucker(proc.getInputStream());
InputStreamSucker errSucker = new InputStreamSucker(proc.getErrorStream());
proc.waitFor();
int exit = process.exitValue();
inSucker.join();
errSucker.join();
InputStreamSucker Code ist hier:
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());
}
}