جافا - يمر مدخلات C الخارجية / تطبيق C ++
-
07-07-2019 - |
سؤال
وأنا أحاول إدخال قيمة في تطبيق خارجي باستخدام جافا.
وتطبيق جافا يبدو مثل هذا:
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
طلب معلق في طريقة WAITFOR.
وتطبيق الخارجي يبدو مثل هذا:
welcome banner
please enter 8 character input:
طباعة وشعار مرحبا بكم باستخدام printf ويؤخذ الإدخال مع SetConsoleMode / ReadConsoleInput. ReadConsoleInput يقرأ حرف واحد وملثمين كانوا مع * حرف.
مساعدة
المحلول 2
وحصلت على الجواب! هو خدعة لاستخدام WriteConsoleInput API () لأن البرنامج يتوقع الحدث لوحة المفاتيح، وليس النص ... وهذا هو السبب في أن WAITFOR () انتظرت إلى الأبد! :)
نصائح أخرى
ويمكنك استخدامها:
proc.getOutputStream().write("some date".getBytes())
ونضع في اعتبارنا أن لديك لقراءة كل شيء التطبيق ترسل المعياري وستدير، وإلا فإنه قد تحصل على الكتابة عالقة هناك. يمكنني استخدام فئة عامة لقراءتها في موضوع مختلف. استخدام مثل:
InputStreamSucker inSucker = new InputStreamSucker(proc.getInputStream());
InputStreamSucker errSucker = new InputStreamSucker(proc.getErrorStream());
proc.waitFor();
int exit = process.exitValue();
inSucker.join();
errSucker.join();
وكود InputStreamSucker هنا هو:
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());
}
}
لا تنتمي إلى StackOverflow