Java调用win的cmd命令

        Java通过Runtime类或ProcessBuilder类提供了调用CMD命令的能力。这两个类都允许Java程序启动一个新的进程并执行特定的命令,通过标准输入输出流进行数据交换。Runtime类适用于简单的命令执行,ProcessBuilder类则更加灵活,适用于复杂的命令和参数传递。

一、使用Runtime类调用CMD命令

        Runtime类提供了exec()方法来执行CMD命令。该方法接收一个String类型的命令字符串,并返回一个Process对象,通过这个对象可以获取命令执行的结果。此方式历史最为悠久,使用也最广,使应用程序能够与其运行的环境相连接,但是在读取上还存在一些不便性,正常的输出流与错误流得分开读取。其他功能基本相同。在jdk8中 Runtime 底层也是通过 ProcessBuilder 实现

public class CmdExecutionExample {
    public static void main(String[] args) {
        try {
            // 调用CMD命令
            String command = "ping 127.0.0.1";
            Process process = Runtime.getRuntime().exec(command);

            // 获取命令输出结果
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完成
            process.waitFor();
        } catch (Exception  e) {
            e.printStackTrace();
        }
    }
}

 二、使用ProcessBuilder类调用CMD命令

        ProcessBuilder类相比Runtime类更加灵活,可以通过链式调用设置命令和参数,同时还可以设置工作目录、环境变量等。此为jdk1.5加入的,它没有将应用程序与其运行的环境相连接。这个就需要自己设置其相关的信息。但它提供了将正常流与流程流合并在一起的解决办法,只需要设置redirectErrorStream(错误流重定向到标准数据流)属性即可。

 class CmdExecutionExample {
    public static void main(String[] args) {
        try {
            // 调用CMD命令
            ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "set"); // /c参数表示执行后关闭CMD窗口
            processBuilder.redirectErrorStream(true); // 将错误输出流与标准输出流合并
            Process process = processBuilder.start();
            // 获取命令输出结果
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完成
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中执行Windowscmd命令并返回该命令的进程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、付费专栏及课程。

余额充值