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

举报
香菜聊游戏 发表于 2022/06/26 21:36:22 2022/06/26
【摘要】 因为要在项目中对语音进行分析,所以要在项目中需要调用ffmpeg也就是说需要调用其他的程序。调用其他的程序可以在命令行中直接调用。所以直接在JAVA中要创建新的进程去。执行这个命令。今天就来聊一下使用JAVA创建进程的一个操作。因为我需要得到输出,所以还要涉及到读取控制台的输出读写。1、先来代码废话不多说,直接上代码 String cmd = "ffprobe -print_format...

image.png

因为要在项目中对语音进行分析,所以要在项目中需要调用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的使用,以及一些注意的点。

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

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



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。