Java - передача ввода во внешнее приложение C / C ++ - PullRequest
1 голос
/ 14 сентября 2009

Я пытаюсь ввести какое-то значение во внешнее приложение, используя Java.

Java-приложение выглядит так:

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 ]

2 голосов
/ 14 сентября 2009

вы можете использовать:

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

имейте в виду, что вы ДОЛЖНЫ читать все, что приложение отправляет на stdout и stderr, иначе оно может застрять при записи. Я использую универсальный класс, чтобы прочитать его в другом потоке. использование как:

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());
    }
}
0 голосов
/ 19 сентября 2009

Получил ответ! Хитрость в том, чтобы использовать API WriteConsoleInput (), потому что программа ожидает события клавиатуры, а не текста ... Вот почему waitFor () ждал вечно! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...