熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java技巧:使用Runtime.exec重定向本地程序調用

2022-06-13   來源: Java核心技術 

  Java具有使用Runtimeexec對本地程序調用進行重定向的能力但是用重定向或者管道進行命令調用將會出錯解決這一問題的辦法是通過命令shell運行命令在Java中調用本地程序會破壞平台獨立性規則但是經常需要這麼做才行
  
  以下是一個簡單類的范例展示了在Unix下運行ls命令的情形
  
  import javaioBufferedInputStream;
  import javaioIOException;
  
  public class ExecLs {
  
   static public void main(String[] args) {
   String cmd = ls
  
   try {
   Process ps = RuntimegetRuntime()exec(cmds);
   Systemoutprint(loadStream(psgetInputStream()));
   Systemerrprint(loadStream(psgetErrorStream()));
   } catch(IOException ioe) {
   ioeprintStackTrace();
   }
   }
  
   // read an inputstream into a String
   static String loadStream(InputStream in) throws IOException {
   int ptr = ;
   in = new BufferedInputStream(in);
   StringBuffer buffer = new StringBuffer();
   while( (ptr = inread()) != ) {
   bufferappend((char)ptr);
   }
   return buffertoString();
  
  
  
  
  
   }
  
  }
  
  上述代碼中重要的部分是exec方法和命令字符串ls本程序將輸出運行目錄下的列表細節
  
  那麼如果你想重定向這些細節內容到文件該怎麼辦?這一命令行的輸入應該寫成ls > FILE但是當你將cmd變量改變成這樣的話運行就會出錯如下
  
  /bin/ls: >: No such file or directory
  /bin/ls: FILE: No such file or directory
  
  出錯的原因在於額外的參數被直接傳送到了ls命令而不是送到實際的命令行解決這一問題的辦法是將cmd串弄成一個字符串數組並且將你想運行的程序傳送到命令shell
  
  因此將cmd行改成下面的樣子
  
   String[] cmd = { sh c ls > FILE };
  
  你將得到一個名為FILE的文件裡面是目錄列表c參數是告訴它讀取隨後的字符串而最後的參數是你要運行的腳本
  
  在這種情況下管道也運行良好所以你可以把命令改成下面的方式
  
  String[] cmd = { /bin/sh c /bin/ls | grep d > FILE };
  
  這種形式將給你一個名為FILE的文件裡面是ls條目中包含d的條目給出sh和ls的全路徑有利於提供你的程序的安全性
  
  雖然使用Runtimeexec不是創建獨立於平台的Java的最佳方式但是有些時候是必要的使用這種重定向技術有助於走出Runtimeexec的限制
  

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25922.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.