【问题标题】:How to run a Perl file using Java? [duplicate]如何使用 Java 运行 Perl 文件? [复制]
【发布时间】:2011-11-04 19:07:19
【问题描述】:

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

我有一个用于远程检查 IP 地址的 perl 文件。我需要在 java 中运行该 perl。请帮助我继续。

【问题讨论】:

标签: java perl


【解决方案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
        }
    }

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 2013-03-03
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2014-07-30
      • 2013-01-01
      • 1970-01-01
      • 2016-03-09
      相关资源
      最近更新 更多