2014-03-04 50 views
0

使用phantomJs在Java將undefinitely塊的簡單的例子:phantomjs在Java中受阻process.waitFor(

public void runPhantomJs(String path, String command) { 
    Process process; 
    String outFile = "a11.txt"; 
    try { 
     process = Runtime.getRuntime().exec(path+ " " + command + " > " +outFile); 

     int exitStatus = process.waitFor(); 

     //String status = (exitStatus == 0 ? "SUCCESS:" : "ERROR:"); 
     File f = new File(outFile); 
     if (f.exists()) { 
      BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF-8")); 

      String str; 
      while ((str = in.readLine()) != null) { 
       System.out.println(str); 
      } 

      in.close(); 
      System.out.println(str); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

腳本執行很簡單,但它在控制檯上返回一整頁:

var webPage = require('webpage'); 
var page = webPage.create(); 
page.open('http://www.google.com/', function(status) { 
if (status !== 'success') { 
    console.log('1'); 
    phantom.exit(); 
} else { 
    console.log(page.content); 
    phantom.exit(); 
} 
}); 

請注意,在粘貼的代碼中,我添加了一個「> a11.txt」來查看它是否更好地讀取文件而不是直接讀取輸出。它應該更快,但由於某種原因,它不起作用。我想重定向>不起作用。

+1

也許它正在等待你消耗輸入/輸出流..即使沒有? – gerrytan

+0

未達到waitFor()後的斷點。等待,直到過程結束,所以它應該工作。如果我使用一個更簡單的腳本(console.log('success!'));它可以工作 – maugch

+0

嘗試在單獨的線程中消耗流,而主線程阻塞 – gerrytan

回答

0

所以我讓我的代碼工作。顯然phantomjs的輸出必須被讀取或緩衝區將完全填滿,阻止進一步的執行。

所以我覺得,如果你修改它,像這樣的代碼將工作:

process = Runtime.getRuntime().exec(path+ " " + command + " > " +outFile); 
BufferedInputStream bis = new BufferedInputStream(process.getInputStream()); 
bis.close(); 
process.waitFor(); 
... 

如果它不能正常工作,請嘗試使用的ProcessBuilder。這是我的工作代碼: try { String phantomJsExe = configuration.getPhantomJsExe()。toString(); String phantomJsScript = configuration.getPhantomJsScript()。toString(); String urlsTextFile = configuration.getPhantomJsUrlsTextFile()。toString();

Process process = new ProcessBuilder(phantomJsExe, phantomJsScript, urlsTextFile).start(); 
    BufferedInputStream bis = new BufferedInputStream(process.getInputStream()); 
    bis.close(); 
    process.waitFor(); 
} catch (Exception ex) { 
    ex.printStackTrace(); 
}