Java for linux Runtime 执行需要转义的脚本(shell)

11 篇文章 0 订阅

最近写了一个利用java for  linux ffmpeg的音频转码服务,发现linux里能执行的脚本用java去执行就不行.普通脚本可以,但是遇到要使用文件名作为参数传递(文件名有空格)时就会提示文件找不到了. 我各种转义,\" \' \[空格] 全试过了,都不行.   将java拼接出来转义后的shell字符串 命令直接复制到linux shell 终端就能执行. 用java Runtime.exec 就是不行. 后面还是被解决了.

假设有文件名参数/home/123   abc.txt  , 那程序就会去读/home/123,然后提示文件找不到.

我在shell终端测试发现,只需要给文件名套上引号就好了. 于是我在Java里面也打算拼接好字符串,加好应该加的空格. 结果发现拼出来的命令字符串和shell下手动输入的一模一样还是执行不了,找不到文件.  我将java生成打印出的命令复制直接shell执行没有任何问题! 那么问题来了. 下面是我犯错的地方.


原来错误重现如下:

1.部分配置文件:

#ffmpeg path 
ffmpeg_path = /home/audiotrans/bin/ffmpeg

#Transcoding parameters  #if#:inputFile  #of#:outputFile
trans_param_common = -i #if# -ab 256000 -ac 2 -ar 48000 #of#

2.代码实现

tips: inputFile 和 outputFile 是两个文件名(ffmpeg 转码用到的输入文件,输出文件参数)  param是获取配置文件中的trans_param_common 项

StringBuilder command = new StringBuilder(executePath);
String param = TranscodeConfig.getPropertyInTrans(paramType.toString());
command.append(" ");command.append(param.replace("#if#", "\""+inputFile+"\"").replace("#of#","\""+outputFile+"\""));// 这部分代码用\" \' \[空格]都转义过,执行都提示file not found

 
Runtime.getRuntime().exec(command.toString());   //省略部分标准输出,输入,error流处理代码 这里执行,提示文件找不到(No such file or directory)


解决实现:

1.部分配置文件

改了改去 也将 \" \' \[空格]直接放到配置中,也还是不行. 最后改回了原样,也就是上面的那个配置

2.代码实现

String executePath = TranscodeConfig.getPropertyInTrans("ffmpeg_path");
String param = TranscodeConfig.getPropertyInTrans(paramType.toString());
List<String> commands = new ArrayList<String>();
commands.add(executePath);
// split param 
String[] params = param.split(" ");
for (String innerParam : params) {
// 如果帶有空格的文件名,直接放進去沒事
if ("#if#".equals(innerParam)) {
	innerParam = inputFile;
} else if ("#of#".equals(innerParam)) {
<span style="white-space:pre">	</span>innerParam = outputFile;
	}
	commands.add(innerParam);
}
<span style="color:#ff0000;">Runtime.getRuntime().exec(commands.toArray(new String[commands.size()]));   // 这里执行的是exec重载方法,arrys:{"程序",参数0,参数1,参数2,参数..]</span>
</pre><pre name="code" class="java">我用这个方法:public Process exec(String[] cmdarray)  throws IOException  的时候,空格没有做任何转义可以正常执行命令,转义反而是错的. 
</pre><pre name="code" class="java">到这里,问题解决了.   其实用java.lang.ProcessBuilder 类 也可以解决这个问题. Runtime底层也是用它实现的.  记录下,希望能帮助到别的小伙伴!

不要手动转义,直接用exec重载方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值