您好,登錄后才能下訂單哦!
這篇文章主要介紹Java如何調用Javascript、Python算法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
最近項目中經常需要將Javascript或者Python中的算法發布為服務,而發布Tomcat服務則需要在Java中調用這些算法,因此就不免要進行跨語言調用算法。不管是調用Javascript文件還是python腳本,都需要將原來的算法文件進行適當的更改,以便可以在Java中傳入參數,并且得到算法運算結果。
一、Java調用Javascript
需要注意的是Javascript是弱類型語言,定義變量只需要一個var就可以搞定,但是在Java中卻要注意變量類型,不同的輸入參數會有不同的類型。
調用js文件時,需要對其進行調整,設置好需要調用的function和相關參數,使用的js文件代碼如下(其中有些核心算法不能展示):
function get3DCode(Latitude,Longitude,Height,level){ var latcode=[];var lngcode=[]; latcode=GeoSOTCode1D(Latitude,level); lngcode=GeoSOTCode1D(Longitude,level); var heicode=[];var geosot3Dcode=[]; heicode=Altcode(Height,level); geosot3Dcode=GeoSOT3D(latcode,lngcode, heicode,level);//三維網格編碼 var d3code=[]; d3code=getQuantcodeString(geosot3Dcode); return d3code; }
在Java中使用對應的接口就可以調用,需要設置js文件路徑和輸入參數,調用的代碼如下;
package whu.get.three.beidou; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * Java調用并執行js文件,傳遞參數,并獲得返回值 */ public class ThreeD_GetBeidouCode { //獲取經緯度及高度,返回三維碼 public static String main(String Latitude,String Longitude,String Height,int CodeSize) throws Exception { //獲取經緯度及高度,保存為double類型 Double latitude = Double.parseDouble(Latitude); Double longitude = Double.parseDouble(Longitude); Double height = Double.parseDouble(Height); int level = CodeSize; //調用js文件 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); String jsFileName = System.getProperty("catalina.home") + "/webapps/3DBeiDouCode/WEB-INF/classes/3Dcode.js"; // 讀取js文件 FileReader reader = new FileReader(jsFileName); // 執行指定腳本 engine.eval(reader); String c = ""; if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; // 調用merge方法,并傳入兩個參數 c = String.valueOf(invoke.invokeFunction("get3DCode", latitude, longitude, height, level)); } reader.close(); return c; //返回三維碼 } }
這里的ThreeD_GetBeidouCode類只是一個普通的類,需要在其他可運行的主函數中調用這個類的main方法,傳入運行參數就可以得到結果。
二、Java調用Python
Java調用python腳本有好幾種方法,最簡單的是通過Jython來直接運行python代碼,但是這種方法不支持python中引用的第三方庫,因此我使用了Runtime來調用的方法,這也相當于是在控制臺執行腳本。
需要注意的是,Java調用python時,不能通過return語句來獲取返回值,而只能通過print將結果寫入到標準輸出流中,然后在Java中通過標準輸入流來讀取到返回結果。
如果對python環境有要求,比如在特定的環境中安裝了需要引用的第三方庫,則還要在Java工程中添加運行環境,在eclipse中點擊Run->Run Configurations->environment,添加Path,值設置為python安裝的路徑。
在python程序中做適當修改:添加引用 import sys,將調用的函數參數設定為sys.argv[1],sys.argv[2]...注意必須是從1開始計數,將需要返回的結果用print函數打印。
本例中python代碼如下:
# -*- coding:utf-8 -*- import BaseFunction import numpy as np import itertools import math import sys #計算中心要素 def cal_central_feature(path,x,y): sf = BaseFunction.open_shpfile(path) x_records = BaseFunction.get_attr_records(sf,x) y_records = BaseFunction.get_attr_records(sf,y) dis = [] for x0,y0 in zip(x_records,y_records): distance = 0 for x1,y1 in zip(x_records,y_records): distance = distance + get_distance(x0,y0,x1,y1) dis.append(distance) i = dis.index(np.min(dis)) result = [x_records[i],y_records[i]] return result #計算兩點之間的距離 def get_distance(x0,y0,x1,y1): xd = x1 - x0 yd = y1 - y0 distance = math.sqrt(xd**2+yd**2) return distance if __name__ == '__main__': result = cal_central_feature(sys.argv[1],sys.argv[2],sys.argv[3]) print(result[0]) print(result[1])
Java中調用的代碼如下:
package whu.get.three.beidou; import java.io.BufferedReader; import java.io.InputStreamReader; /** * Java調用并執行js文件,傳遞參數,并活動返回值 */ public class CalCentralFeatureClass { //輸入shp路徑,獲取坐標 public static String main(String filepath) { String pyPath = System.getProperty("catalina.home") + "/webapps/CalCentralFeature/WEB-INF/classes/CalCentralFeature.py"; //python文件路徑 String[] args = new String[] { "python", pyPath, filepath, "x","y"}; String c = ""; //記錄返回值 try { Process proc = Runtime.getRuntime().exec(args); //執行py文件 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { c = c+line+' '; } in.close(); proc.waitFor(); } catch (Exception e) { e.printStackTrace(); } return c; //返回結果 } }
得到的運算結果中,每一個python中print的結果,對應一個in.readLine(),可以按照需要獲取自己想要的結果。
如果需要將調用python的程序用tomcat發布為服務,也需要配置tomcat的運行環境,同樣是添加一個Path,賦值為python安裝路徑。
以上是Java如何調用Javascript、Python算法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。