java中process方法用处_Java Process 简略使用方法以及坑点

Process可以用来开一个子进程,调用其他程序。

假设调用app.exe  工作目录./dir 命令行参数 -arg1=1 -arg2=2 环境变量envp1=e1 envp2=e2

调用方法为

import java.io.*;

public class YccRuntime {

public static void main(String[] arg) throws Exception {

Runtime r = Runtime.getRuntime();

//参数1 指令 参数2 环境变量(没有就设置为null) 参数3 工作目录

Process p = r.exec("app.exe -arg1=1 -arg2=2", new String[]{"envp1=e1","envp2=e2"}, new File(".\\dir\\"));

//获取进程的输入输出流,由于windows默认编码为gbk,因此需要特别设置一下编码,不然输出中文会出现乱码

//out输出流,向子进程写入数据

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream(), "GBK"));

//in输入流,获取子进程的输出

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));

//err输入流,获取子进程打印的错误信息

BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream(), "GBK"));

//一方面输入输出流的缓冲区有限,要及时处理,否则会阻塞

//另外一方面,如果输入流中没有数据,调用readLine()方法会造成阻塞,

//因此建议单独开一个线程处理输入流,但这里作为演示,就不这么做了

//获取子进程三行输出

System.out.println(in.readLine());

System.out.println(in.readLine());

System.out.println(in.readLine());

//向子进程写入数据 122 234 注意结尾加个换行符,否则子进程会以为你输入还没结束

out.write("122 234\n");

//务必调用flush方法把数据写入

out.flush();

//获取子进程一行输出

System.out.println(in.readLine());

//输入数据让子进程结束

out.write("end\n");

out.flush();

//进程结束,输入流没有更多数据,此时调用readLine会遇到EOF终止符,返回null

System.out.println(in.readLine());

//如果有错误信息,会输出信息但是本程序没有,因此和in一样,输出null

System.out.println("错误信息:"+err.readLine());

//等待子进程结束

p.waitFor();

System.out.println("进程结束 返回值"+p.exitValue());

}

}

app.exe的代码如下

#include

#include

#include

#include

using namespace std;

int main(int argcnt,char **args)

{

for(int i=1;i

printf("参数 %s ",args[i]);

//每次输出要记得输出换行符,以及调用fflush(stdout)把输出写入到流中

printf("\n");

fflush(stdout);

printf("envp1=%s\n",getenv("envp1"));

printf("envp2=%s\n",getenv("envp2"));

fflush(stdout);

int x,y;

while(1){

if(scanf("%d",&x)!=1)

break;

if(scanf("%d",&y)!=1)

break;

printf("%d\n",x+y);

fflush(stdout);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值