سؤال

وأنا أحاول إدخال قيمة في تطبيق خارجي باستخدام جافا.

وتطبيق جافا يبدو مثل هذا:

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());
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top