java呼叫windows的CMD命令的細節
阿新 • • 發佈:2019-02-16
在使用Java程式呼叫視訊推流的ffmpeg.exe程式時,遇到視訊快取導致推流中斷的情況,特此記錄一下這個細節
1.程式碼原點
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("ping 127.0.0.1 -t");
2.pom.xml
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>4.1.0</version> </dependency>
3.資源使用的不同
//開啟windows視窗,如果啟動的是exe程式,則啟動的exe將使用windows資源
String cmdStr1 = cmd /k ping 127.0.0.1 -t
//不開啟windows視窗,如果啟動的是exe,則exe所消耗的是JAVA虛擬機器的資源
String cmdStr2 = ping 127.0.0.1 -t
4.程序銷燬
//銷燬JAVA虛擬機器中的程序 process.destroy(); //銷燬windows作業系統的程序,通過PID private static void killProcessTree(Process process){ try { Field f =process.getClass().getDeclaredField("handle"); f.setAccessible(true); long handl =f.getLong(process); Kernel32 kernel = Kernel32.INSTANCE; WinNT.HANDLE handle = new WinNT.HANDLE(); handle.setPointer(Pointer.createConstant(handl)); int ret =kernel.GetProcessId(handle); Long PID =Long.valueOf(ret); String cmd =getKillProcessTreeCmd(PID); Runtime rt =Runtime.getRuntime(); Process killPrcess = rt.exec(cmd); killPrcess.waitFor(); killPrcess.destroy(); }catch(Exception e) { e.printStackTrace(); LOG.info(e.getMessage()); } } private static String getKillProcessTreeCmd(Long Pid) { String result = ""; if(Pid !=null) result ="cmd.exe /c taskkill /PID "+Pid+" /F /T "; return result; }