Java 执行终端命令之 Process

本文由黑壳网发布

本文来源Java执行终端命令 - 黑壳网http://blog.bhusk.com/articles/2018/01/10/1515580637699.html

壳叔搞笑一刻

餐厅里原来的收银员叫我大哥,她家的亲戚朋友经常来餐厅消费,和她同辈的也随她叫我大哥,哪天有一桌客人喝完酒,结账时耍酒疯,这时候,收银员的弟弟带着十几个汉子来餐厅就餐,一个个轮番喊大哥,直接把耍酒疯的吓的赶紧结账走人,不让打狠折了!

正文

项目需要有些安全机制,如果被触发到,就需要shutdown 把服务器给关掉。所以想了一个比较简单的办法,让Java执行终端命令就可以了。

百度科普了一下, java.lang.Process
官方类说明 https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html

介绍

以下这段内容来自官方翻译

ProcessBuilder.start()Runtime.exec 方法创建一个本机进程,并返回的子类的实例Process可以用来控制过程,并获得相关信息。该类Process 提供了从进程执行输入,执行输出到进程,等待进程完成,检查进程的退出状态以及销毁(终止)进程的方法。

创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程,守护进程,Microsoft Windows上的Win16 / DOS进程或shell脚本。

默认情况下,创建的子流程没有自己的终端或控制台。其所有的标准I / O(即标准输入,标准输出,标准错误)操作将被重定向到父进程,在那里他们可以经由使用所述方法获得的流进行访问 getOutputStream()getInputStream()getErrorStream()。父进程使用这些流将输入提供给子进程并从子进程获取输出。由于某些本地平台仅为标准输入和输出流提供有限的缓冲区大小,因此如果不及时写入输入流或读取子流程的输出流,可能会导致子流程阻塞甚至死锁。

如果需要, 子流程I / O也可以 使用ProcessBuilder类的方法重定向

当没有更多的Process对象引用时,子进程不会被终止,而是子进程继续异步执行。

不要求Process对象所代表的进程异步地或同时地对拥有该Process对象的Java进程执行。

从1.5开始,ProcessBuilder.start()是创建一个的首选方法Process

方法摘要

以下表格是根据官方文档进行翻译的

  • | :-: |
    修饰符和类型 | 方法和描述
    abstract void | destroy 杀死子进程。
    Process | 杀死子进程。
    abstract int | [exitValue]返回子流程的退出值。
    abstract InputStream | [getErrorStream]返回连接到子进程的错误输出的输入流。
    abstract InputStream | [getInputStream]返回连接到子进程正常输出的输入流。
    abstract [OutputStream | [getOutputStream] 返回连接到子进程正常输入的输出流。
    boolean | [isAlive]测试由此表示的子进程是否Process还活着。
    abstract int | waitFor导致当前线程等待(如有必要),直到此Process对象表示的进程已终止。
    boolean | 导致当前线程等待(如有必要),直到此Process对象表示的子进程已终止,或经过指定的等待时间。

过多的详细,可以参考 Process官方提供的说明,非常的详细。

我写了一个非常通用的代码示例,可供参考

 代码示例
	/**
	 * 在控制台输入命令 *  
	 * @param command 代表要执行的命令
	 */
    public static void writeCommand(String command) {
	  Process pro = null;
	  try {
		  pro = Runtime.getRuntime().exec(command);

		  /**
		   *  虽然cmd命令可以直接输出,但是通过IO流技术可以保证对数据进行一个缓冲。 
		   */  
		  BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
		  String msg = null;

		  while ((msg = br.readLine()) != null) {
					System.out.println(msg);
		  }
	  } catch (IOException e) {
		  e.printStackTrace();
		  //logger.error("IOException",e);
	  }
	}

关于我们

程序员太辛苦了

请善待你们身边的每一位程序员~

欢迎在评论写下你的程序员自黑体呦,嗯,相信你可以滴~~~~~~

以上内容,均来自互联网~

欢迎扫描二维码加入我们的组织
黑壳网交流群 Qq:200408242


黑壳博客 blog.bhusk.com

E-mail:keshu@bhusk.com

本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。

可自由转载、引用,但需署名作者且注明文章

留下你的脚步
推荐阅读