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;
}
java中process方法用处_Java Process 简略使用方法以及坑点相关推荐
- java中怎么调用对数函数_Java对数函数及其运算方法
Java对数函数的计算方法非常有问题,然而在API中却有惊人的误差.但是假如运用了以下的方法,用Java处理数字所碰到的小麻烦就可以轻而易举的解决了. Sun的J2SE提供了一个单一的Java对数方法 ...
- Java中的isnan函数_Java Float类isNaN()方法与示例
语法:public boolean isNaN (); public static boolean isNaN(float value); float 类isNaN()方法isNaN()方法在java ...
- java中replace的用法_Java String replace() 使用方法及示例
Java String replace() 使用方法及示例 Java String replace()方法用 新的字符/文本 替换字符串中每个匹配的旧字符/文本. replace()方法的语法是 st ...
- java中Math.pow()实例_Java.math.BigDecimal.pow()方法实例
全屏 Java.math.BigDecimal.pow()方法实例 java.math.BigDecimal.pow(int n)返回一个BigDecimal,其值是 (thisn), 被精确计算的幂 ...
- java中get接口示例_Java即时类| 带示例的get()方法
java中get接口示例 即时类的get()方法 (Instant Class get() method) get() method is available in java.time package ...
- java中get接口示例_Java LocalDateTime类| 带示例的get()方法
java中get接口示例 LocalDateTime类的get()方法 (LocalDateTime Class get() method) get() method is available in ...
- java中equals的重写_Java重写equals方法(重点讲解)
为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...
- opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类
opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...
- java中序列化与反序列化_Java中的序列化
java中序列化与反序列化 Java提供了一种称为序列化的机制,以按字节的有序或字节序列的形式持久化Java对象,其中包括对象的数据以及有关对象的类型和存储在对象中的数据类型的信息. 因此,如果我们已 ...
- java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法
在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...
最新文章
- 2020年,图机器学习的趋势有哪些?
- activemq 异步和同步接收
- 深入理解RunLoop(转载)
- WYSE率先支持RemoteFX功能
- PHP开发一个简单的成绩录入系统
- 【尚硅谷】大厂必备技术之JUC并发编程——笔记总结
- dedecms提取某栏目及子栏目名称到首页怎么弄
- java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂
- python 使用pexpect实现自动交互示例
- 用实际的软件编程示例解释C#中的装饰器模式
- better-scroll插件 api
- 游戏设计入门——游戏程序框架设计
- 主题黑板.html,黑板报主题
- 短视频获客系统另附属源码理论分享
- 群晖服务器216j增加硬盘,群晖DS216j影视库搭建方法 | 群晖DS216j存储服务器怎么样_什么值得买...
- 【ERROR】INSERT 语句与 CHECK 约束CK__Student__Ssex__6EF57B66冲突。
- python编写的动物识别专家系统_自己写的简单动物识别专家系统
- #力扣 LeetCode1646. 获取生成数组中的最大值 @FDDLC
- 连接远程计算机提示:“这可能是由于CredSSP加密数据库修正” 问题
- android友盟自定义事件,友盟:自定义事件