Java 执行终端命令之 Process

本贴最后更新于 2507 天前,其中的信息可能已经事过景迁

本文由黑壳网发布

本文来源 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


  • 工具

    子曰:“工欲善其事,必先利其器。”

    286 引用 • 729 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Process
    2 引用 • 3 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    😂 😂 😂 😂 😂 青岛哪里的

  • someone

    我与你同在😎

  • someone

    😄