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();
}
}
}
要使代码正常工作,请执行以下步骤 -
- 在 E 目录中创建一个名为 Text 的文件夹。
- 创建两个名为“error.txt”和“output.txt”的空文本文件。
- 创建一个名为“commands.txt”的文本文件,该文件应具有 -
javac 演示。Java
Java演示 - 创建一个名为“Demo. Java”,其中应该存在源代码,“main(String[] args)”函数应该存在于“Demo”类中。
- 最后编译并执行上面写的代码。
- 如果有任何错误,日志将出现在“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")