java 等待命令执行结果_Java执行CMD命令并等待返回结果

执行命令部分

try {

String command = "java -version";

Process p = Runtime.getRuntime().exec(command);

StreamCaptureThread errorStream = new StreamCaptureThread(p.getErrorStream());

StreamCaptureThread outputStream = new StreamCaptureThread(p.getInputStream());

new Thread(errorStream).start();

new Thread(outputStream).start();

p.waitFor();

result = command + "\n" + outputStream.output.toString()

+ errorStream.output.toString();

System.out.print(result);

} catch (Exception e) {

e.printStackTrace();

}

StreamCaptureThread

private class StreamCaptureThread implements Runnable {

InputStream stream;

StringBuilder output;

public StreamCaptureThread(InputStream stream) {

this.stream = stream;

this.output = new StringBuilder();

}

public void run() {

try {

try {

BufferedReader br = new BufferedReader(

new InputStreamReader(this.stream));

String line = br.readLine();

while (line != null) {

if (line.trim().length() > 0) {

output.append(line).append("\n");

}

line = br.readLine();

}

} finally {

if (stream != null) {

stream.close();

}

}

} catch (IOException ex) {

ex.printStackTrace(System.err);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java执行Windows的cmd命令返回命令的进程ID,您可以使用`Process`类和`ProcessBuilder`类来实现。下面是一个示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class CmdExecutionWithProcessBuilderExample { public static void main(String[] args) { try { // 创建ProcessBuilder对象 ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "echo Hello World"); // 启动进程 Process process = processBuilder.start(); // 获取进程ID long pid = getProcessId(process); System.out.println("进程ID:" + pid); // 等待命令执行完毕 process.waitFor(); System.out.println("命令执行完毕!"); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } private static long getProcessId(Process process) { long pid = -1; try { // 获取Process对象内部的pid字段 if (process.getClass().getName().equals("java.lang.Win32Process") || process.getClass().getName().equals("java.lang.ProcessImpl")) { java.lang.reflect.Field field = process.getClass().getDeclaredField("handle"); field.setAccessible(true); long handle = field.getLong(process); // 调用Windows API获取进程ID Kernel32 kernel = Kernel32.INSTANCE; WinNT.HANDLE winHandle = new WinNT.HANDLE(); winHandle.setPointer(Pointer.createConstant(handle)); pid = kernel.GetProcessId(winHandle); } } catch (Exception e) { e.printStackTrace(); } return pid; } } // 定义内部类和接口以获取进程ID interface Kernel32 extends com.sun.jna.Library { Kernel32 INSTANCE = com.sun.jna.Native.load("kernel32", Kernel32.class); int GetProcessId(WinNT.HANDLE Process); } interface WinNT extends com.sun.jna.win32.StdCallLibrary { interface HANDLE extends com.sun.jna.PointerType { } } ``` 在上面的示例中,我们使用`ProcessBuilder`类创建一个cmd命令的进程,并使用`start()`方法启动该进程。然后,我们通过调用`getProcessId()`方法获取该进程的ID。 `getProcessId()`方法使用Java Native Access (JNA)库来调用Windows API,从`Process`对象中获取进程的句柄,并通过句柄获取进程ID。 请注意,上述代码需要依赖JNA库,您需要在项目中引入JNA库的相关依赖。此外,根据您执行的具体命令和环境,可能需要进行额外的适配和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值