Java for linux Runtime 执行需要转义的脚本(shell) 分类: Linux Java 2014-12-25 20:35 343人阅读 评论(2) 收藏
2014-12-25 20:35
507 查看
最近写了一个利用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.部分配置文件:
2.代码实现
解决实现:
1.部分配置文件
改了改去 也将 \" \' \[空格]直接放到配置中,也还是不行. 最后改回了原样,也就是上面的那个配置
2.代码实现
不要手动转义,直接用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重载方法。
相关文章推荐
- Java for linux Runtime 执行需要转义的脚本(shell) 分类: Linux Java 2014-12-25 20:35 344人阅读 评论(2) 收藏
- Java for linux Runtime 执行需要转义的脚本(shell)
- Shell脚本编程学习入门 02 分类: arm-linux-Ubuntu 2013-08-30 17:45 427人阅读 评论(0) 收藏
- Shell脚本编程学习入门 01 分类: arm-linux-Ubuntu 2013-08-30 17:42 409人阅读 评论(0) 收藏
- HI3531编译helloworld,执行错误 分类: HI3531 arm-linux-Ubuntu 2013-12-30 09:19 572人阅读 评论(0) 收藏
- 【原创】Linux下motion执行相关(备忘) 分类: Linux --- motion 2015-01-06 09:13 71人阅读 评论(0) 收藏
- 在shell脚本中调用sqlplus 分类: H2_ORACLE 2013-06-23 13:01 1437人阅读 评论(0) 收藏
- Error: No suitable device found: no device found for connection 'System eth0' 分类: Linux 2015-03-18 21:24 63人阅读 评论(0) 收藏
- UBOOT添加命令的执行流程 分类: arm-linux-Ubuntu HI3531 2013-12-24 09:24 514人阅读 评论(0) 收藏
- Ubuntu的shell之bash和dash 分类: arm-linux-Ubuntu 2013-08-20 17:25 664人阅读 评论(0) 收藏
- 解决linux下java读取串口之权限问题 No permission to create lock file. 分类: LINUX 2010-07-13 20:51 2006人阅读 评论(0) 收藏
- Python下调用Linux的Shell命令 分类: ubuntu python基础学习 2014-01-15 17:12 15631人阅读 评论(1) 收藏
- shell脚本实现冒泡排序 分类: 学习笔记 linux ubuntu 2015-07-10 14:16 79人阅读 评论(0) 收藏
- 【原创】TCP Socket 简单练习 --- 线程池实现并发服务器 分类: Linux --- 应用程序设计 2014-12-25 13:59 50人阅读 评论(0) 收藏
- 先执行linux的clear清屏命令,再执行其他操作 分类: python 小练习 2013-09-13 11:23 441人阅读 评论(0) 收藏
- LINUX下java串口程序环境配置 分类: LINUX 2010-07-07 10:04 1571人阅读 评论(0) 收藏
- 手工编译、运行JavaSE项目,且此项目需要第三方jar包支持,且文件中有打包。 分类: java 2010-03-27 10:37 1057人阅读 评论(0) 收藏
- Linux上安装JDK 分类: B1_JAVA B3_LINUX 2014-08-29 15:12 449人阅读 评论(0) 收藏
- Error: No suitable device found: no device found for connection 'System eth0' 分类: Linux 2015-03-18 21:24 64人阅读 评论(0) 收藏
- Shell脚本编程入门(一) 分类: 学习笔记 linux ubuntu 2015-07-09 21:06 29人阅读 评论(0) 收藏