Java調用Linux命令(cd的處理)
阿新 • • 發佈:2017-05-31
time wait adl 連接 ktr lose exce 簡單 res
一、Java調用Linux系統的命令非常簡單
這是一個非常常用的調用方法示例:
1 public String executeLinuxCmd(String cmd) { 2 System.out.println("got cmd job : " + cmd); 3 Runtime run = Runtime.getRuntime(); 4 try { 5 Process process = run.exec(cmd); 6 InputStream in = process.getInputStream();7 BufferedReader bs = new BufferedReader(new InputStreamReader(in)); 8 // System.out.println("[check] now size \n"+bs.readLine()); 9 String result = null; 10 while (in.read() != -1) { 11 result = bs.readLine(); 12 System.out.println("job result [" + result + "]"); 13 } 14 in.close(); 15 // process.waitFor(); 16 process.destroy(); 17 return result; 18 } catch (IOException e) { 19 e.printStackTrace(); 20 } 21 return null; 22 }
二、含有cd操作的方法示例
1. 問題背景
1.1 java程序運行在/home/lings目錄下;
1.2 希望刪除/home/test目錄下的文件proxy.log;
1.3 調用上面的接口兩次?
executeLinuxCmd("cd /home/test"); executeLinuxCmd("rm -fr /home/proxy.log");
是不行的!
1.4 這個接口的調用是單次事務型的,就是每次調用都是獨立的事務或者說操作,沒有關聯的。
那這種“復雜”一點的操作流程怎麽辦呢?
1.5 方法a: 可以寫一個獨立的腳本,然後一次運行腳本,這樣多復雜的邏輯都沒問題。
1.6 方法b: 可以啟動一個shell長連接,保持連接,發送多條命令,最後釋放連接。
示例邏輯代碼:
1 public void executeNewFlow() { 2 Runtime run = Runtime.getRuntime(); 3 File wd = new File("/bin"); 4 System.out.println(wd); 5 Process proc = null; 6 try { 7 proc = run.exec("/bin/bash", null, wd); 8 } catch (IOException e) { 9 e.printStackTrace(); 10 } 11 if (proc != null) { 12 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 13 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true); 14 out.println("cd /home/test"); 15 out.println("pwd"); 16 out.println("rm -fr /home/proxy.log"); 17 out.println("exit"); 18 try { 19 String line; 20 while ((line = in.readLine()) != null) { 21 System.out.println(line); 22 } 23 proc.waitFor(); 24 in.close(); 25 out.close(); 26 proc.destroy(); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 } 31 }
Java調用Linux命令(cd的處理)