問題性質:java調用第三方程式,建立子程序并對其管理
解決:使用Runtime類和Process類
思路:
Runtime rt=Runtime.getRuntime(); - Runtime 運作時類;
唯一存在(單例),使用者不可建立和執行個體化(就是new Runtime());
可用靜态方法getRuntime()擷取目前Runtime執行個體,可用于擷取JVM相關狀态資訊或操作JVM;
Process pr=rt.exec(args); - Runtime的exec()建立子程序,傳回一個Process執行個體;
Process抽象程序類;
接受 rt.exec(args) 傳回的Process執行個體,并可以管理它
代碼:
java工具類:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class PythonInvoke {
public static void invokePy(String []para) {
System.out.println("執行....");
try {
Process process=Runtime.getRuntime().exec(para);
//接收子程序的I/O操作(py腳本執行的輸入輸出)
//process.getInputStream() 将子程序的i/o流重定向到父程序,由父程序控制子程序的i/o
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK")); //windows下編碼GBK防止java讀取亂碼
String line;
while((line=reader.readLine())!=null) {
System.out.println(line);
}
reader.close();
process.destory(); //結束子程序
//process.waitFor(); //使子程序等待,可能會引起阻塞-待分析(輸入輸出導緻緩存滿?)
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println("結束....");
}
}
python腳本:
# -*- coding: UTF-8 -*-
import numpy as np
def main():
a = np.ones(3)
print(a)
print('java 調用py腳本')
if __name__ == '__main__':
main()
測試代碼:
public class Test {
public static void main(String[] args) {
String []para=new String[] {"python","D:\\java_invoked.py"};
PythonInvoke.invokePy(para);
}
}
标簽:process,調用,java,String,python,Process,程序,Runtime
來源: https://www.cnblogs.com/floakss/p/10719906.html