zoukankan      html  css  js  c++  java
  • 在Java程序中操作进程

    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 {
    		List<String> commands = new ArrayList<>();
    		commands.add("cmd");// 构造所要执行的命令
    		commands.add("/c"); // 必须要这个参数
    		commands.add("dir");
    		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文件
    		Process p = pb.start();
    		// 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());
    			}
    		}
    	}
    
    }
    
  • 相关阅读:
    Block & 代理
    堆&栈, 内存分配
    ASI 的 使用
    iOS开发-清理缓存功能的实现
    iOS8是如何跳转系统设置页面
    键盘弹出获取高度
    http://www.jianshu.com/collection/9a22b04a9357
    IOS 字符串中去除特殊符号 stringByTrimmingCharactersInSet
    iOS 判断输入是否全是空格
    iOS AFN 请求封装方法
  • 原文地址:https://www.cnblogs.com/zhrb/p/14285136.html
Copyright © 2011-2022 走看看