天天看点

java Process

有时候,需要使用Java调用Windows的cmd窗口去执行一些命令,或者调用Linux的terminal窗口执行命令。可以使用java的java.lang.Process类来完成。

String command="*********";
Process process=Runtime.getRuntime().exec(command); process.waitFor();
           

在使用此方式时候,对于command,有通过调用Windows的cmd窗口或者Linux的terminal窗口来执行命令的,也有不通过terminal来执行命令的。标志1是直接执行的,没有调用terminal;标志2是调用了terminal来执行命令的;标志3是调用了Windows的cmd来执行命令的。

//说明:/usr/local/ffmpeg/bin/ffmpeg是ffmpeg的路径,可以在PATH中配置其路径,然后就可以直接使用ffmpeg命令了
//标志1
command="/usr/local/ffmpeg/bin/ffmpeg -y -i /usr/local/tomcat/webapps/simplest_video_website/videoori/12345.mp4 -ss 5 -s 220x110 -f image2 -vframes 1 /usr/local/tomcat/webapps/simplest_video_website/videothumbnail/48.jpg
"
//标志2。注意提前安装好gnome-terminal,否则命令无法识别。或者也可以使用/bin/sh
String command="gnome-terminal -x /usr/local/ffmpeg/bin/ffmpeg -y -i "+"\""+realfileoriPath+"\""+
" -ss "+thumbnail_ss_cfg.getVal()+" -s 220x110 -f image2 -vframes 1 "+"\""+realthumbnailPath+"\"";
//标志3
String command="cmd /c start ffmpeg -y -i "+"\""+realfileoriPath+"\""+
                        " -ss "+thumbnail_ss_cfg.getVal()+" -s 220x110 -f image2 -vframes 1 "+"\""+realthumbnailPath+"\"";
           

对于标志1的执行,没有调用terminal,可以执行;但是当使用标志2的方式来执行时候,总是会报错:路径找不到。但是将命令输出,然后手动粘贴到terminal去执行,是正常无误的。原因目前还未知,猜想是Java对路径作了解析。对于这种参数问题,参考网页8中给出了一个参考方式,使用数组的方式传递参数

Runtime.getRuntime().exec(new String[]{"sh","-c",raw2flvCmd});
           

标志3是Windows环境下的。

cmd /c dir 是执行完dir命令后关闭命令窗口。

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。

另外,有关于PATH

直接在命令行中设置PATH,只对当前会话有效

修改~/.bashrc只是对当前用户有效的PATH

修改.bash_profile只是对当前用户有效

修改/etc/profile是对所有用户生效

让修改立即生效,可使用source /etc/profile或者

. /etc/profile

source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。

报错bash: syntax error near unexpected token

(' 需要转义\( xxx \) shell转义符,分为双引号,单引号,以及\ 双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,

,即双引号会解释字符串的特别意思,而单引号直接使用字符串.如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。如果要查询包含空格的字符串,经常会用到双引号。

HP-Pavilion-g4-Notebook-PC:/usr/local$ echo $x
bin eclipse etc ffmpeg games hadoop include lib man mysql mysql-server_5-ubuntu14_amd64.deb-bundle.tar Python sbin selenium share src tomcat
HP-Pavilion-g4-Notebook-PC:/usr/local$ echo "$x"
*
HP-Pavilion-g4-Notebook-PC:/usr/local$ echo '$x'
$x
           

另外还看到使用JNative.jar的方式调用windows API。

参考网址

[1]如何在java程序中调用linux命令或者shell脚本http://www.cnblogs.com/x_wukong/p/5148152.html

[2]Java Process中waitFor()的问题http://blog.csdn.net/jimzhai/article/details/7864806

[3]Java中调用Windows API的方法http://blog.csdn.net/grpideas/article/details/7337185

[4]Java调用windows程序http://blog.csdn.net/54powerman/article/details/649086

[5]cmd、start命令中有空格的解决方法

http://blog.sina.com.cn/s/blog_5052ef9d0100inri.html

[6]cmd /c和cmd /k

http://blog.csdn.net/liuyukuan/article/details/5974517

[7]shell 引号 转义符 通配符 特殊字符http://blog.csdn.net/zhoulixin8/article/details/50112975

[8]Java 调用 FFMPEG 命令时用 url 作为输入源,Linux 下出现 “no such file or directory” 问题的解决http://www.tuicool.com/articles/n67vae