如何使用Java运行Perl文件?

时间:2011-11-04 10:27:40

标签: java perl

  

可能重复:
  How should I call a Perl Script in Java?

我有一个perl文件,用于远程检查ip地址。我需要在java.please中运行perl帮助我继续。

2 个答案:

答案 0 :(得分:1)

您需要Runtime.getRuntime().exec()方法。需要考虑的一些要点:

  • 您必须在命令行中显式调用perl:“perl myprog.pl”。内核通常执行的隐式解释器选择在exec()方法中不起作用。
  • 你必须确保perl的路径在你的程序的PATH环境中, 或者在传递给exec()电话
  • 的环境中
  • 您必须完全消耗您创建的进程的stdout和stderr,否则呼叫将不会终止。

(上面提到的ProcessBuilder类简化了其中的一些问题。)

答案 1 :(得分:1)

ProcessBuilder示例

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import org.apache.commons.io.FileUtils;
    OutputStreamWriter writer =null;
    BufferedReader stdoutBR = null;
    try {
        File tmp = new File("temp_dir");
                    File cmdFile = File.createTempFile("foo", ".sh", tmp);
        File stdout = File.createTempFile("foo_stdout", ".txt", tmp);
        File stderr = File.createTempFile("foo_stderr", ".txt", tmp);

        String script = "/usr/bin/perl foo.pl 2>"+stderr.getAbsolutePath()+" >"+stdout.getAbsolutePath()+" \n";
        cmdFile.setExecutable(true);
        FileUtils.writeStringToFile(cmdFile, script);           

        ProcessBuilder processBuilder = new ProcessBuilder(cmdFile.getAbsolutePath());
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        InputStream numbStream = process.getInputStream();
        stdoutBR = new BufferedReader(new InputStreamReader(numbStream));

        String line = null;
        StringBuilder unexpectedOutput = new StringBuilder();
        while ((line = stdoutBR.readLine()) !=null) {
            unexpectedOutput.append(line);
            unexpectedOutput.append("\n");

        }
        process.waitFor();
        stdoutBR.close();
        log.debug("Process exit value:"+process.exitValue());
        if (process.exitValue() != 0) {
            String stdoutString = FileUtils.readFileToString(stdout);
            String stderrString = FileUtils.readFileToString(stderr);
            throw new RuntimeException("Problem executing script. \nOutput:"+unexpectedOutput.toString()+"\nStdout:"+stdoutString+"\nStderr:"+stderrString);
        }

        String output = FileUtils.readFileToString(stdout);
                    FileUtils.deleteQuietly(cmdFile); 
        FileUtils.deleteQuietly(stdout);
        FileUtils.deleteQuietly(stderr);

    } finally {
        try {
            if (writer != null) {
                writer.close();
            }
        }
        catch (Exception e) {
            //TODO
        }
    }