📜  Java中ProcessBuilder创建一个基本的在线判断

📅  最后修改于: 2022-05-13 01:54:48.853000             🧑  作者: Mango

Java中ProcessBuilder创建一个基本的在线判断

我们已经讨论了创建外部进程的进程和运行时。在这篇文章中,我们讨论了具有相同目的的 ProcessBuilder。
让我们了解一个需要获取源代码并找出语言的应用程序。应用程序需要一个字符串(包含源代码)作为输入。应用程序需要找出编写源代码的语言。源代码将具有相关的扩展名。例如 -

  • C 语言代码将具有“.c”扩展名
  • C++ 中的代码将具有“.cpp”扩展名
  • Java中的代码将具有“.Java名
  • Python中的代码将具有“.py”扩展名

使用输入文件的名称,可以找到要使用的所需语言。
回想一下,在Java中编译代码是使用命令完成的——
“javac 主要。Java”
并执行它,我们使用 -
“Java主”
其他语言也有类似的命令。因此,我们需要一个单独的文本文件,其中包含我们的软件应一一执行的所有命令。
如果出现错误(运行时或编译器错误),我们的应用程序应将错误日志写入单独的文本文件中。无论源代码产生什么输出,我们的应用程序都应该将其写入另一个文本文件。
我们使用“Language”包中的“ProcessBuilder”类来执行操作系统进程。
现在我们必须先创建一个流程——

ProcessBuilder pb = new ProcessBuilder("cmd"); 

请注意,我们使用“cmd”,以便我们的命令可以在命令提示符下轻松执行。
假设我们在“commands.txt”文件中有我们的命令,我们希望将输出与“error.txt”中的错误日志一起存储在“output.txt”中。我们应该将它们全部告诉 ProcessBuilder 对象。 “ProcessBuilder”类有方法——

  • 公共 ProcessBuilder 重定向输入(文件文件)
  • 公共 ProcessBuilder 重定向输出(文件文件)
  • 公共 ProcessBuilder 重定向错误(文件文件)

所有的理由都已经确定,我们只需要开始我们的过程。调用一个进程就像一个线程。我们使用 - pb.start()
开始我们的过程。
下面是一个示例Java代码,用于编译和运行另一个Java代码-

Java
// Java program to demonstrate use of ProcessBuilder
// to compile and run external files.
import java.util.*;
import java.io.*;
class Main
{
    public static void main(String [] args) throws IOException
    {
        try {
            // create a process
            ProcessBuilder pb = new ProcessBuilder("cmd");
 
            // take all commands as input in a text file
            File commands = new File("E:\\test\\commands.txt");
 
            // File where error logs should be written
            File error = new File("E:\\test\\error.txt");
 
            // File where output should be written
            File output = new File("E:\\test\\output.txt");
 
            // redirect all the files
            pb.redirectInput(commands);
            pb.redirectOutput(output);
            pb.redirectError(error);
 
            // start the process
            pb.start();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}


要使代码正常工作,请执行以下步骤 -

  1. 在 E 目录中创建一个名为 Text 的文件夹。
  2. 创建两个名为“error.txt”和“output.txt”的空文本文件。
  3. 创建一个名为“commands.txt”的文本文件,该文件应具有 -
    javac 演示。Java
    Java演示
  4. 创建一个名为“Demo. Java”,其中应该存在源代码,“main(String[] args)”函数应该存在于“Demo”类中。
  5. 最后编译并执行上面写的代码。
  6. 如果有任何错误,日志将出现在“error.txt”文件中,以免输出显示在“output.txt”中。

警告:

  • 确保您希望编译和执行的代码不包含无限循环或类似的东西,这可能会导致您的程序永远运行。您可以通过允许源代码运行固定时间来处理这种情况。例如——如果代码运行时间超过 10 秒,则抛出类似“超出时间限制”的错误。为此,您可以在“Process”类中使用“waitFor()”函数。
  • 您必须检查代码是否正确编译,然后您才应该尝试运行它,否则会显示错误日志文件。

好处-

  • 您可以使用此技术创建自己的在线法官。
  • 它将帮助您将软件与操作系统直接链接。

Runtime.getRuntime.exec() 和 ProcessBuilder 之间的区别:
Runtime.getRuntime.exec() 在单独的进程中执行指定的字符串命令。另一方面, ProcessBuilder 只接受一个字符串列表,其中数组或列表中的每个字符串都被假定为一个单独的参数。然后将参数连接成一个字符串,然后传递给操作系统执行。

// ProcessBuilder takes a list of arguments
   ProcessBuilder pb =
   new ProcessBuilder("myCommand", "myArg1", "myArg2");

   // Runtime.getRuntime.exec() takes a single string
   Runtime.getRuntime.exec("myCommand myArg1 myArg2")