1. 程式人生 > >java呼叫windows的CMD命令的細節

java呼叫windows的CMD命令的細節

在使用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;
    }