我们讨论过 进程和运行时 创建外部流程。在本文中,我们将讨论ProcessBuilder,它也有同样的用途。 让我们了解一个需要获取源代码并了解语言的应用程序。应用程序需要一个字符串(包含源代码)作为输入。应用程序需要找出源代码所用的语言。源代码将有一个相关的扩展。例如——
- C语言的代码将有“.C”扩展名
- C++中的代码将具有“.cpp”扩展名
- Java中的代码将具有“.Java”扩展名
- Python中的代码将具有“.py”扩展名
使用输入文件的名称可以找到需要使用的语言。 回想一下,用java编译代码是通过以下命令完成的—— “javac Main.java” 为了执行它,我们使用—— “java Main” 其他语言也有类似的命令。因此,我们需要一个单独的文本文件,其中包含我们的软件应该逐个执行的所有命令。 如果出现错误(运行时或编译器错误),我们的应用程序应该将错误日志写入一个单独的文本文件中。无论源代码生成什么输出,我们的应用程序都应该将其写入另一个文本文件中。 我们使用“语言”包中的“ProcessBuilder”类来执行操作系统进程。 现在我们必须首先创建一个流程-
ProcessBuilder pb = new ProcessBuilder("cmd");
请注意,我们使用的是“cmd”,因此我们的命令可以在命令提示符下轻松执行。 假设我们的命令在“commands.txt”文件中,我们希望将输出存储在“output.txt”中,错误日志存储在“error.txt”中。我们应该把它们全部告诉ProcessBuilder对象。“ProccessBuilder”类具有以下方法:
- 公共ProcessBuilder重定向输入(文件)
- 公共ProcessBuilder重定向输出(文件)
- 公共ProcessBuilder重定向错误(文件)
一切准备就绪,我们只需要开始我们的进程。调用一个进程就像一个线程。我们使用-pb。开始() 开始我们的过程。 下面是编译和运行另一个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”的文件,其中应该有源代码,并且“Demo”类中应该有“main(String[]args)”函数。
- 最后编译并执行上面编写的代码。
- 如果有任何错误,日志将出现在“error.txt”文件中,以免输出显示在“output.txt”中。
警告:
- 确保您希望编译和执行的代码不包含无限循环或可能导致程序永远运行的类似内容。您可以通过允许源代码在固定时间内运行来处理这种情况。例如,如果代码运行时间超过10秒,抛出一个错误,比如“超过时间限制”。为此,可以在“Process”类中使用“waitFor()”函数。
- 必须检查代码是否正确编译,然后才应尝试运行它,否则将显示错误日志文件。
优势-
- 你可以使用这种技术创建自己的在线法官。
- 它将帮助您将软件与操作系统直接链接。
运行时之间的差异。getRuntime。exec()和ProcessBuilder: 运行时。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")
本文由 苏亚什·斯利瓦斯塔瓦 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。