程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 代碼-java 在linux中執行命時,遠程文件地址問題

代碼-java 在linux中執行命時,遠程文件地址問題

編輯:編程綜合問答
java 在linux中執行命時,遠程文件地址問題

今天寫了一個格式轉換的工具,使用下面cmd進行格式轉換操作

 Runtime.getRuntime().exec("/home/ffmpeg -i \" "+filepath+ "\" -y -ab 32 -ar 22050 -qscale 10  -r 15  /home/ffmpeg/temp/")  

代碼在eclipse和Windows控制台上跑都可以成功完成,但是在linux上面總是出問題,
將生成的命令復制到linux單獨執行,卻可以執行成功,
最後進過半天的調試,發現是filepath 兩邊的_ 雙引號 _的問題,
除去雙引號,程序可以正常執行了,有木有大神能說說原因啊,
----------------linux小白

最佳回答:


命令參數含有引號,作為字符串本身傳遞給java又要加引號,需要考慮引號的逃逸。

或者從上到下說
1. Java exec本身的參數是一個字符串;
2. 由於這個串本身不是命令,而是命令和參數的混合體,肯定通過bash -c "cmd"的形式傳遞給bash,這裡又是一層引號;
3.命令的某個參數(文件名)可能含有空格,所以從bash的角度,需要用引號把參數保護起來。

把引號去掉變ok,這是碰巧:如果文件名裡含有空格(如果允許的話),那一樣會報錯。可以驗證一下。
原始命令的\"應該是出於這個目的才存在的。

最簡單的作法,由於bash既接受單引號也接受雙引號來包含參數,把雙引號換成單引號就可以了,這樣就不需要\"來保護了。
當然其缺陷是filepath中不能包含單引號。

復雜點的作法,把\"替換為\\",增加一層逃逸(注意兩邊都要有)。但它同樣有filepath不能有雙引號的問題。

nswcfd
qq_28003739
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved