вызов Perl-скрипта из Java-кода в интерактивном режиме - PullRequest
1 голос
/ 03 марта 2011

Может ли кто-нибудь помочь мне в следующем сценарии,

Мне нужно вызвать Perl-скрипт из моего Java-кода.Скрипт perl - это интерактивный код, который получает ввод от пользователя во время его выполнения и продолжается до конца.Итак, пример, который я использовал, заключается в том, что скрипт perl при выполнении запрашивает возраст, печатая в консоли «Сколько вам лет?», Когда пользователь вводит какое-то значение, скажем «26».Затем выводится «ВАУ! Тебе 26 лет!».

Когда я попытался вызвать этот скрипт из своего кода Java, процесс ждет, пока я не передам значение как 26 в выходном потоке, а во входном потоке естьне имеет значения.Затем, наконец, когда я снова читаю входной поток, я получаю весь вывод сценария вместе.Итак, я не могу сделать его интерактивным?

Я просмотрел много форумов и блогов, но не смог найти ни одного, который бы точно соответствовал моим требованиям.

Вот код Java

import java.io.*;

public class InvokePerlScript {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Process process;

        try
        {
        process = Runtime.getRuntime().exec("cmd /c perl D:\\sudarsan\\eclips~1\\FirstProject\\Command.pl");

              try {
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
             }
                } catch (IOException e) {
          e.printStackTrace();
                 }

        try {
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
            out.write("23");
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

            process.waitFor();
        if(process.exitValue() == 0)
        {
        System.out.println("Command Successful");
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = null;
                while ((line = in.readLine()) != null) {
                System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else
        {
        System.out.println("Command Failure");
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                String line = null;
                while ((line = in.readLine()) != null) {
                System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        }
        catch(Exception e)
        {
        System.out.println("Exception: "+ e.toString());
        }
    }

}

Код Perl:

$| = 1;
print "How old are you? \n";
$age = <>;
print "WOW! You are $age years old!";

Заранее спасибо, Сударсан

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Похоже, что вы пытаетесь прочитать полную строку в этом коде:

        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
           ...

Однако в вашем Perl-коде вы не печатаете символ конца строки, поэтому readLine никогда не возвращается (согласно документации ).

1 голос
/ 03 марта 2011

Вы вызываете flush() для OutputStream в Java после записи значений?Если вы этого не сделаете, есть большая вероятность, что они просто будут храниться в буфере потока в Java-процессе, и поэтому никогда не попадут в Perl (в результате оба процесса ожидают ввода-вывода другого).

(В зависимости от реализации потока это может или не может быть необходимым, но это определенно не повредит - и меня это укусило в прошлом. Обычно не нужно быть таким осторожным, поскольку очистка происходит неявно при вызове close(), но здесь вы не можете закрыть поток после того, как закончите писать.)

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