問題性質: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 {
/**
* java項目調用python腳本
* 輸入:py文件的絕對路徑
* 輸出:
*/
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); } }
