使用java程式碼呼叫exe程式 (包括引數傳遞)
阿新 • • 發佈:2019-01-11
使用Java程式碼呼叫exe
1使用場景
我現在使用eclipse+tomcat的架構建立了web server, 在這個web project中我需要建立一個定時任務,在定時任務中執行本地的一個C#工程生成的exe。
2Java程式碼
public class MyTask extends TimerTask { public void run() { System.out.println("call at " + (new Date())); // TODO æ¤å¤„æ·»åŠ å…·ä½“ä»»åŠ¡ä»£ç try { String cmdStr1="D:/download/SvmGridParameterTraining/SvmGridParameterTraining/EasySvmTrain/bin/Debug/EasySvmTrain newtrain.txt newtest.txt"; Runtime.getRuntime().exec("cmd.exe /c start "+cmdStr1); }catch(Exception e){ e.printStackTrace(); } } }
getRuntime().exec()中的引數包括exe檔案全路徑和引數 (我後面的兩個txt引數直接寫在後面即可)
/c 的意思是執行之後關閉命令列。
3陷阱:exe工作路徑
按以上程式碼執行後,發現程式並沒有按預期執行。 經過測試發現 作為引數的newtrain.txt 和newtest.txt 為空。 所以我分析在程式的執行路徑下並沒有這兩個檔案。
在呼叫的C#程式中加入如下程式碼:
Headache 2014/8/29 13:28:11 Console.WriteLine("Environment.CurrentDirectory:" + Environment.CurrentDirectory); Console.WriteLine("Directory.GetCurrentDirectory():" + Directory.GetCurrentDirectory()); String input2 = Console.ReadLine();
打印出專案的工作目錄,可以發現。在單獨呼叫C#工程時,工作目錄為C#的工程目錄,而使用tomcat +eclipse 做定時任務時, 打印出的目錄是tomcat的目錄。
因為源程式需要使用的newtrain和newtest檔案都在C#目錄下, 所以通過java呼叫時傳進去的newtrain 和 newtest這兩個引數實際上是沒什麼意義的(tomcat下並沒有這兩個檔案)
4解決方式
根據打印出的當前工作目錄, 把引數檔案放到相應的目錄下。