集美大学 计算机 郑如滨

教学博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Java可以使用RunTime类调用CMD命令。可参考如下文章
java调用cmd命令

Java还可使用Process类来启动一个操作系统进程,执行所需命令。请参考如下代码。
操作步骤:

  1. 将要执行的命令字符串放入List中。并将该List作为ProcessBuilder构造方法的参数。
  2. 对ProcessBuilder进行设置。如,设置工作目录、合并输出流和错误流、重定向输出等。
  3. 调用ProcessBuilder的start()方法获得一个Process对象,即启动一个进程。
  4. 使用Process对象处理该进程的输入、输出。还可以以异步方式接收进程执行的通知。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

/**
 * 本程序演示如何使用PorcessBuilder与Process
 *   在Java代码中启动一个单独的操作系统进程并执行相应命令
 * @author zhrb
 *
 */
public class ProcessTest {

	public static void main(String[] args) throws IOException, InterruptedException {
                //1.准备命令字符串列表
		List<String> commands = new ArrayList<>();
		commands.add("cmd");// 构造所要执行的命令
		commands.add("/c"); // 必须要这个参数
		commands.add("dir");
                //2.对ProcessBuilder进行设置
		ProcessBuilder pb = new ProcessBuilder(commands);
		// ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "dir");                    
		pb.directory(Path.of("d:/").toFile());// 设置工作目录到D盘
		pb.redirectErrorStream(true); // 合并输出流和错误流
		pb.redirectOutput(Path.of("d:/process.txt").toFile());//将输出定向到d:/process.txt文件
                //3.启动Process对象(启动一个进程)
		Process p = pb.start();
                //4.使用Process对象处理该进程的输入、输出
		// printUsingScanner(p);
		printUsingInputStreamReader(p);
		int result = p.waitFor(); // 等待进程p执行结束。p未结束时将阻塞。
		System.out.println("result:" + result); // 0代表正常结束
		int state = p.exitValue(); // 0代表正常结束
		System.out.println("执行状态:" + state);
		
		//以下为异步演示代码
		/*p.onExit().thenAccept(//异步通知
				process->System.out.println("exit value: "+ process.exitValue()));
		while(p.isAlive()) { //进程结束后跳出该循环
			System.out.println("alive"); 
			TimeUnit.MILLISECONDS.sleep(10);
		}*/
		System.out.println("main end");
	}

	private static void printUsingInputStreamReader(Process p) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));) {
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void printUsingScanner(Process p) {
		try (var in = new Scanner(p.getInputStream())) {
			while (in.hasNextLine()) {
				System.out.println(in.nextLine());
			}
		}
	}

}
posted on 2021-01-16 10:32  zhrb  阅读(517)  评论(0编辑  收藏  举报