Java执行Cmd命令

简介

有时候需要跟cmd/shell程序交互,实时读取响应流。

方法

windows平台需要先切换utf8编码(chcp 65001),这里使用的是processBuilder.start()方式来执行shell,可以非阻塞的方式持续获取控制台上的输出流。如果使用的是Runtime.getRuntime().exec(“”).getInputStream()则会先阻塞至命令执行完成后,才会返回控制台上的内容。

public void execShell() {
	ProcessBuilder processBuilder = getProcessBuilder(question, isWindows);
	// 启动进程并执行命令
	Process p = processBuilder.start();
	InputStream is = p.getInputStream();
	InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
	try (BufferedReader br = new BufferedReader(isr)) {
	    // windows平台第一行输出为切换编码成功
	    if (isWindows) {
	        br.readLine();
	    }
	    int len = -1;
	    char[] buf = new char[512];
	    StringBuilder builder = new StringBuilder();
	    ChatResponse.Data data = new ChatResponse.Data();
	    data.setSession_id(sessionId);
	    Result<ChatResponse.Data> result = Results.success(data);
	    while ((len = br.read(buf)) > 0) {
	        builder.append(new String(buf, 0, len));
	        data.setChat_result(builder.toString());
	        emitter.send(result);
	    }
	}
	// 等待命令执行完成
	p.waitFor();
}

// 判断是否是window平台
private boolean isWindows() {
    String osName = System.getProperty("os.name").toLowerCase();
    return osName.contains("win");
}

private ProcessBuilder getProcessBuilder(String cmd, boolean isWindows) {
        question = question.replaceAll("\n", "\\\\n");
        if (isWindows) {
            return new ProcessBuilder("cmd.exe", "/c", "chcp 65001 &&" + cmd);
        } else {
            // linux
            return new ProcessBuilder("/bin/sh", "-c", cmd);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值