版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32447321/article/details/81433700
昨天PM说要把微服务优化一个量级,因为用的是apache thrift 做RPC; 那首当其冲的就要把thrift 的gen-java 这个client手动生成操作痛点要解决 ;目前转换效果很差,BUT,这不重要,本文介绍的是使用java代码 在指定目录下执行DOS命令。这是一期,后期版本update定要做成类似generatorMybatisConfig.xml 的eclipse插件
开门见山关键点:
Runtime.getRuntime().exec(command) 这句代码是执行系统命令的关键。
exec()函数有很多重构方法,主要包含如下
public Process exec(String command)-----在单独的进程中执行指定的字符串命令。
public Process exec(String [] cmdArray)---在单独的进程中执行指定命令和变量
public Process exec(String command, String [] envp)----在指定环境的独立进程中执行指定命令和变量
public Process exec(String [] cmdArray, String [] envp)----在指定环境的独立进程中执行指定的命令和变量
public Process exec(String command,String[] envp,File dir)----在有指定环境和工作目录的独立进程中执行指定的字符串命令
public Process exec(String[] cmdarray,String[] envp,File dir)----在指定环境和工作目录的独立进程中执行指定的命令和变量
package com.generatorThrift;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
/**
*
* @title alex of RPC SERVER CONFIG
* @project thrift-generator平台
* @note java bean generator thrift of java bean config
* @author alex
* @date 2018年8月5日
*/
public class TestThriftexe {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();// java的API,获得一个对象
// rt.exec("notepad.exe");// 与在cmd中输入一个notepad的效果一样的
// try {
// rt.exec("cmd /c cd d:\\java\\tools\\thrift\\thrift-0.9.3\\evshare thrift -r --gen java .\\IServiceEvreadyOrder.thrift");
// } catch (IOException e) {
// e.printStackTrace();
// }
convert("IServiceEvreadyOrder.thrift","D:\\java\\tools\\thrift\\thrift-0.9.3\\evshare");
}
public static void convert(String filePath,String fileName){
try {
File dir = new File(filePath);//此处是指定路径
String[] cmd = new String[] { "cmd", "/c", "thrift -r --gen java "+fileName};// cmd[2]是要执行的dos命令
System.out.println(cmd[2]);
Process process = Runtime.getRuntime().exec(cmd,null,dir);
// 记录dos命令的返回信息 下面我没用到,因为thrift 指定了生产目录gen-java,待研究更优化
StringBuffer resStr = new StringBuffer();
// 获取返回信息的流
InputStream in = process.getInputStream();
Reader reader = new InputStreamReader(in);
BufferedReader bReader = new BufferedReader(reader);
for (String res = ""; (res = bReader.readLine()) != null;) {
resStr.append(res + "\n");
}
System.out.println(resStr.toString());
bReader.close();
reader.close();
process.getOutputStream().close(); // 不要忘记了一定要关
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ps:特别鸣谢:小小小鸟blog
cmd /c dir 是执行完dir命令后关闭命令窗口。
cmd /k dir 是执行完dir命令后不关闭命令窗口。
cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。
cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
可以用cmd /?查看帮助信息。