本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Java
代码中调用
shell
脚本和
python
脚本并获得输出结果(分为小数
据量和大数据量)
2015/12/23 3161
Java
代码中调用
shell
和
python
脚本有多种实现方式,通用方
式是使用
java.lang
中的
Runtime
类新开进程,调用
python
脚本的一个例子如下
(
shell
同理):
public
String
python(String
pythonPath,
String[]
params)
{
File
file
=
new
File(pythonPath);
if
(!file.exists()){
return
“python
脚本不存在!
”;
String[]
command
=
Arrays.copyOf(new
String[]{“python”,
pythonPath},
params.length
+
2);
System.arraycopy(params, 0, command, 2, params.length); List res = new ArrayList ();
try
{
Process
process
=
Runtime.getRuntime().exec(command,
null,
null);
process.waitFor();
Scanner scanner = new Scanner(process.getInputStream()); while
(scanner.hasNextLine())
{
String
line
=
scanner.nextLine();
res.add(line);
}
catch
(IOException
e)
{
e.printStackTrace();
}
catch
(InterruptedException
e)
{
e.printStackTrace();
return
“success”;
}
例子中,参数
pythonPath
就是
python
脚本的绝对路径,参数
params
是脚本的参数数组,
command
就是执行
python
命令字符串数组,格式就是
python
+
脚本
+
参数,构造好
command
后传入
exec()
中执行新进程,然后调用
waitFor()
函
数等待进程结束,结束后从进程的输入流中获得脚本的输出结果存储到字符串数组
中。
乍一看,上面的代码并没有问题,对于少量的输出结果执行后相当完美,但是
当脚本的输出结果大小大于
inputStream
缓冲区大小时,程序会阻塞在
waitFor()
函数
这里,问题就在于脚本的输出结果是在进程执行完之后才读取,一个好的解决办法
就是新开一个清理线程来不断清空缓冲区,也就是输出和读取同时进行,代码如
下: