Невозможно запустить сценарий Perl из Java - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь запустить Perl в java, Perl присутствует в C: / xampp / perl / bin / perl .exe, а сценарий Perl присутствует в C: / xampp / perl / bin / samplecode.pl этот Perl скрипт возвращает 1 или 0 в зависимости от переданного ввода. Код, который я написал в java:

import java.io.InputStreamReader;

public class testfile {

    public static void main(String[] args) {
String n="accountno=10&password=123qw&username=usha";
        try {

            Process run = Runtime.getRuntime()
                    .exec(new String[] { "C:\\xampp\\perl\\bin\\perl.exe", "C:\\xampp\\perl\\bin\\samplecode.pl" ,n});
            BufferedReader output = new BufferedReader(new InputStreamReader(run.getInputStream()));

            run.waitFor();

            String temp;
            while ((temp = output.readLine()) != null) {
                System.out.println(temp);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Это ничего не печатает в консоли. Может ли кто-нибудь сказать мне, где я ошибаюсь.

1 Ответ

0 голосов
/ 21 июня 2020

Вызов waitFor должен быть после чтения из потоков.

while ((temp = output.readLine()) != null) {
    System.out.println(temp);
}
int exitCode = run.waitFor();

Обратите внимание, что если ваш процесс записывает много данных в потоки вывода или ошибки, ваш процесс может не завершиться. В этом случае вам нужно обработать выходной поток в фоновом потоке или заменить Runtime.getRuntime().exec(), чтобы использовать ProcessBuilder и перенаправить вывод в файлы, которые вы прочитаете позже. Попробуйте этот пример cmds:

String[] cmd = new String[]{"cmd.exe", "/c", "echo", "1"};
String[] cmd = new String[]{"cmd.exe", "/c", "echo", "0"};
String[] cmd = new String[]{"cmd.exe", "/c", "dir", "/s", "C:\\Program Files"};
String[] cmd = new String[]{"cmd.exe", "/c", "dir", "/s", "C:\\Program Files", "1>&2"};
String[] cmd = new String[]{"cmd.exe", "/c", "dirt"};

При звонке:

ProcessBuilder pb = new ProcessBuilder(cmd); 
File fileOut = new File("C:\\Temp\\std-output.log"); 
File fileErr = new File("C:\\Temp\\std-error.log"); 
pb.redirectError(fileErr); 
pb.redirectOutput(fileOut); 
Process p = pb.start(); 
int rc = p.waitFor();
System.out.println("Exit   : "+rc);
System.out.println("STDOUT : "+Files.readString(fileOut.toPath()));
System.out.println("STDERR : "+Files.readString(fileErr.toPath()));
...