java 调用系统外部的某个程序

有时候我们java 调用系统外部的某个程序

可能需要调用系统外部的某个程序,此时就可以用Runtime.getRuntime().exec()来调用,他会生成一个新的进程去运行调用的程序。

此方法返回一个java.lang.Process对象,该对象可以得到之前开启的进程的运行结果,还可以操作进程的输入输出流。

Process对象有以下几个方法:

  1、destroy()      杀死这个子进程

  2、exitValue()      得到进程运行结束后的返回状态

  3、waitFor()       得到进程运行结束后的返回状态,如果进程未运行完毕则等待知道执行完毕

  4、getInputStream()  得到进程的标准输出信息流

  5、getErrorStream()  得到进程的错误输出信息流

  6、getOutputStream() 得到进程的输入流

现在来讲讲exitValue(),当线程没有执行完毕时调用此方法会跑出IllegalThreadStateException异常,最直接的解决方法就是用waitFor()方法代替。

但是waitFor()方法也有很明显的弊端,因为java程序给进程的输出流分配的缓冲区是很小的,有时候当进程输出信息很大的时候回导致缓冲区被填满,如果不及时处理程序会阻塞。如果程序没有对进程的输出流处理的会就会导致执行exec()的线程永远阻塞,进程也不会执行下去直到输出流被处理或者java程序结束。

解决的方法就是处理缓冲区中的信息,开两个线程分别去处理标准输出流和错误输出流。

程序如下:

public class ExecTest {

    public static void main(String[] args) throws IOException, InterruptedException {
      String cmd = "cmd /c dir c:\\windows";
      final Process process = Runtime.getRuntime().exec(cmd);
      printMessage(process.getInputStream());
      printMessage(process.getErrorStream());
      int value = process.waitFor();
      System.out.println(value);
    }

    private static void printMessage(final InputStream input) {
      new Thread(new Runnable() {
         public void run() {
            Reader reader = new InputStreamReader(input);
            BufferedReader bf = new BufferedReader(reader);
            String line = null;
             try {
                while((line=bf.readLine())!=null) {
                    System.out.println(line);
                }
             } catch (IOException e) {
                e.printStackTrace();
             }
         }
      }).start();
    }
}

如上程序,读取进程的输出信息并打印到控制台就不会发生阻塞,程序能正常的结束。

tips:

  cmd命令不能需要加上cmd /c才能执行,不然java会去path中找dir.exe

  在windows一般字符集编码为GBK,需要在转换成Reader的时候指定为GBK编码.

时间: 2024-09-28 14:44:04

java 调用系统外部的某个程序的相关文章

Java 调用系统默认程序打开

比如,我要打开一个PPT文件,怎么办?最简单的办法,调用系统默认的PowerPoint打开. 这里用到的是  Java.awt.Desktop类 Desktop 类允许 Java 应用程序启动已在本机桌面上注册的关联应用程序,以处理 URI 或文件. 支持的操作包括: 启动用户默认浏览器来显示指定的 URI: 启动带有可选 mailto URI 的用户默认邮件客户端: 启动已注册的应用程序,以打开.编辑或打印指定的文件. 下面举个栗子: package com.sujian; import ja

使用隐式意图调用系统拨号,呼叫程序

Action ·拨号Action:Intent.ACTION_DIAL ·呼叫Action:Intent.ACTION_CALL Permission ·在Android系统中,敏感操作(涉及隐私的,安全的,可能产生费用的) 都需要申请权限,且当应用程序被安装到设备上之前,会列举当前应用程序所申请的权限,用户可以选择继续安装该应用程序,或不安装. ·通话权限为: <uses-permission android:name="android.permission.CALL_PHONE&quo

java调用系统打印机

需要装驱动package org.jeecg.print;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.print.PageFormat;import java.awt.print.Printable;import java.awt.print.PrinterException;import java.awt.print.PrinterJob;/** * @Auth

【Android】使用Intent调用系统其它程序,使用onKeyDown对音量键的监听,长按事件

Intent在安卓编程中非常常见,在<[Android]多个Activity之间利用bundle传递数值>(点击打开链接)中已经展示了它可以唤醒其它Activity并在Activity之间传递数据.其实Intent的作用远非于此,它还可以调用系统中其它固有程序,比如拨打电话.发送短信等.onKeyDown也是如此,不仅仅可以对设备的菜单键进行监听,这在<[Android]各式各样的弹出框与对菜单键.返回键的监听>(点击打开链接)中已经展示过的,对设备的音量调节键也是可以监听的, 下

使用downloadmanager调用系统的下载

/** * 文件名 UpdateDownload.java * 包含类名列表 com.issmobile.numlibrary.tool * 版本信息  版本号  * 创建日期 2014年7月14日 * 版权声明  */ package com.issmobile.numlibrary.tool; import com.iss.utils.LogUtil; import android.annotation.SuppressLint;import android.app.DownloadMana

python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为

1.参考 autopy (实践见最后一章节) 用Python制作游戏外挂(上) AutoPy Introduction and Tutorial autopy.mouse.smooth_move(1, 1) 可以实现平滑移动 autopy - API Reference pip install PyUserInput SavinaRoja/PyUserInput [python3.5][PyUserInput]模拟鼠标和键盘模拟 Python-模拟鼠标键盘动作 autoit selenium借助

Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。

源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Came

Java调用其他程序时waitFor()阻塞

Java调用其他程序时waitFor()阻塞  http://www.cnblogs.com/yejg1212/archive/2013/06/02/3114242.html

调用系统程序

拨打电话 1 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" 2 + "4006-513520")); 3 startActivity(intent); 发送短信 1 Intent intent = new Intent(Intent.ACTION_VIEW); 2 intent.setType("vnd.android-dir/mms-sms"); 3 startA