2016-06-21 176 views
0

我試圖通過JAVA運行UNIX命令。我的shell命令調用一個豬腳本。當我這樣做在Unix終端excersize它工作正常,但通過Java我沒有得到任何輸出。使用JAVA和UNIX運行Pig命令

PFB的JAVA代碼:

public String executeCommand(String command) { 

    StringBuffer output = new StringBuffer(); 

    Process p; 
    try { 
     System.out.println("process started"); 
     p = Runtime.getRuntime().exec(command); 
     //p.waitFor(); 
     System.out.println("before reader"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     //String line = "";   
     System.out.println("After reader "); 
     while (reader.readLine() != null) { 
      System.out.println("inside while loop *******************************"); 
      output.append(reader.readLine() + "\n"); 
      System.out.println(reader.readLine()); 
     } 
     System.out.println("while loop endedr"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("inside exception"); 
    } 
    return output.toString(); 
} 

pig_command: 時間豬-param下載=「/家/ ******** /下載/存檔/預訂/ 20160620 * /部分*「-param outdir =」/ home/*********/OUTDIR/HOURLYBOOKING/20160620/05「-stop_on_failure -x mapreduce /home/directory/pig/pigscript.pig

我怎麼樣運行java程序: java -cp /home/directory/java_jar.jar com.Example.Tester pig_command

問題:儘管輸出在HDFS中成功生成,但上述while循環中的代碼不會打印任何內容(應打印作業日誌)。

回答

0

每次調用readline()都會轉到流中的下一行。 while循環在代碼被省略在每個readline()呼叫(System.out.printlnoutput.append...)兩行,所以如果你的豬腳本的輸出只有一個或然後兩行什麼都不會被打印在控制檯或while環所附上的StringBuffer(output)。

爲了解決這個問題...您的

 //String line = "";   
     System.out.println("After reader "); 
     while (reader.readLine() != null) { 
      System.out.println("inside while loop *******************************"); 
      output.append(reader.readLine() + "\n"); 
      System.out.println(reader.readLine()); 
     } 

實現應該是:

 String line = null;   
     System.out.println("After reader "); 
     while ((line = reader.readLine()) != null) { 
      //System.out.println("inside while loop *******************************"); 
      output.append(line + "\n"); 
      System.out.println(line); 
      } 
+0

感謝您的答覆,但是這已經被測試過,結果是相同的,而內碼循環未執行。 –