让其他进程当小兵,Java调用命令行,so easy

Posted 香菜聊游戏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让其他进程当小兵,Java调用命令行,so easy相关的知识,希望对你有一定的参考价值。

因为要在项目中对语音进行分析,所以要在项目中需要调用ffmpeg

也就是说需要调用其他的程序。

调用其他的程序可以在命令行中直接调用。所以直接在JAVA中要创建新的进程去。执行这个命令。

今天就来聊一下使用JAVA创建进程的一个操作。

因为我需要得到输出,所以还要涉及到读取控制台的输出读写。

1、先来代码

废话不多说,直接上代码

   String cmd = "ffprobe -print_format json -show_streams -show_format /home/chongxin/audio/erdai.mp4";
//        String cmd = "ls";

        Runtime run = Runtime.getRuntime();
        Process process = run.exec(cmd);
        try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"))) 

            StringBuilder sb = new StringBuilder();
            String lineStr;
            while ((lineStr = br.readLine()) != null) 
                sb.append(lineStr);
            
            boolean flag = process.waitFor(timeout, TimeUnit.SECONDS);
            if (!flag) 
                log.error("Trans probe audioAnalyse 命令执行失败! url=", url);
                readErrorStream(process, url);
             else 
                ObjectMapper mapper = new ObjectMapper();
                return mapper.readValue(sb.toString(), HashMap.class);
            
            System.out.println(sb.toString());
        

2、技术解析

Runtime.exec 方法创建一个本机进程,

并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。

Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

看下API

abstract  void	destroy()   杀掉子进程。
abstract  int	exitValue() 返回子进程的出口值。
abstract  InputStream	getErrorStream()  获取子进程的错误流。
abstract  InputStream	getInputStream() 获取子进程的输入流。
abstract  OutputStream	getOutputStream() 获取子进程的输出流。
abstract  int	waitFor() 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止

知识点1:

exec会导致当前线程阻塞,直到process执行完毕

知识点2:

当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。

知识点3:

waitFor 相当于超时的时间,超时后会主动返回

知识点4:

要根据宿主的系统执行命令,也就是说不能在linux上部署的时候使用window下的命令

比如linux下可以执行ls,但是在window下必须是dir

总结

今天讲的不多,主要是process的使用,以及一些注意的点。

希望在以后使用的过程中可以有所帮助,

写作不易,希望得到大家的三连,谢谢大家

 

以上是关于让其他进程当小兵,Java调用命令行,so easy的主要内容,如果未能解决你的问题,请参考以下文章

等待 Java 进程的回答?

什么adb命令会写入应用so文件

《现代命令行工具指南》1. 干掉进程:让干掉进程变得简单直接 - Fkill

Android 逆向修改运行中的 Android 进程的内存数据 ( Android 命令行中获取要调试的应用进程的 PID | 进程注入调试进程内存的 so 库 )

003-golang 调用外部命令

在退出 java 启动的命令行命令或 shell 脚本之前提取进程环境