可以优化一下上段代码吗
时间: 2023-11-06 19:08:27 浏览: 29
当然可以,下面是一个优化过的版本:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class LinuxCommandExecutor {
public static String executeCommand(List<String> command, int timeoutInSeconds) throws Exception {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
StringBuilder output = new StringBuilder();
StringBuilder error = new StringBuilder();
BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
boolean completed = process.waitFor(timeoutInSeconds, TimeUnit.SECONDS);
if (!completed) {
process.destroy();
throw new Exception("Command timed out after " + timeoutInSeconds + " seconds");
}
readStream(stdoutReader, output);
readStream(stderrReader, error);
int exitCode = process.exitValue();
if (exitCode != 0) {
throw new Exception("Command exited with non-zero exit code: " + exitCode + "\nError: " + error.toString());
}
return output.toString();
}
private static void readStream(BufferedReader reader, StringBuilder output) throws IOException {
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
}
}
```
这个版本使用了Process.waitFor(long timeout, TimeUnit unit)方法来等待进程完成。如果进程在指定的超时时间内没有完成,则会抛出异常。此外,我们也不需要再手动判断进程是否已完成,因为waitFor()方法会自动等待进程完成。
使用示例与之前的版本相同:
```java
List<String> command = List.of("ls", "-l");
String output = LinuxCommandExecutor.executeCommand(command, 10);
System.out.println(output);
```
这个例子执行ls -l命令,并将结果输出到控制台。如果命令执行时间超过10秒,则会抛出超时异常。