2014-02-17 75 views
3

我想使用GraphViz在我的程序中生成一些圖形。這只是一個問題:我不想生成任何臨時文件。使用Java創建GraphViz圖形,無需任何中間文件

以下是我從這裏得到:

public class GraphBuilder{ 
    /* Some code generating a DOT formatted String representing my graph */ 

    /* Generation the graph using the plain format */ 
    Runtime runtime = Runtime.getRuntime(); 
    Process p = null; 
    try { 
     p = runtime.exec("neato -Tplain c:\\users\\tristan\\desktop\\test1"); 
    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
    } 

    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    StringBuilder builder = new StringBuilder(); 
    String line = null; 
    try{ 
     while ((line = br.readLine()) != null) { 
      builder.append(line); 
      builder.append(System.getProperty("line.separator")); 
     } 
    } catch(IOException e){ 

    } 
    String result = builder.toString(); 
    System.out.println(result); 

確定,所以,從現在開始,我的程序讀取一個文件,但我想要的NEATO程序讀取早些時候由程序生成我的字符串。

我該怎麼辦?

在此先感謝!

+0

你已經搜索的Java API在這裏吧? http://www.graphviz.org/Resources.php – Leo

+0

是的,但似乎每個Java API使用臨時文件 – Kaijiro

+0

這是一個恥辱。 :-(如果它們中的任何一個是開源的,也許你可以使用它來使用流,而不是寫入磁盤。對不起,沒有更好的建議:-( – Leo

回答

5

喜歡的東西:

// Create the process 
Process process = new ProcessBuilder("neato", "-Tplain").start(); 

// Write to process's stdin 
OutputStream osToProcess = process.getOutputStream(); 
PrintWriter pwToProcess = new PrintWriter(osToProcess); 
pwToProcess.write("graph G { node1 -- node2; }"); // for example 
pwToProcess.close(); 

// Read from process's stdout 
InputStream isFromProcess = process.getInputStream(); 
BufferedReader brFromProcess = new BufferedReader(isFromProcess); 
// do whatever you want with the reader, then... 
brFromProcess.close(); 

// optionally... 
process.waitFor(); 

我省略例外從這個例子代碼處理 - 你需要把它放在滿足您的要求。將所有東西包裝在try/catch塊中可能就足夠了 - 這取決於你需要的東西。

我驗證了neato讀取在命令行中/寫標準輸入/輸出:

$ echo 'graph G { n1 -- n2; }' | neato -Tplain 
graph 1 1.3667 1.2872 
node n1 0.375 0.25 0.75 0.5 n1 solid ellipse black lightgrey 
node n2 0.99169 1.0372 0.75 0.5 n2 solid ellipse black lightgrey 
edge n1 n2 4 0.55007 0.47348 0.63268 0.57893 0.7311 0.70457 0.81404 0.81044 solid black 
stop 
+0

本來使用的是Runtime.exec()。ProcessBuilder從Java 1.5開始推薦使用。 – slim

+0

Dude你真是太棒了!非常感謝!!!! * windows用戶注意事項:刪除圖形聲明周圍的引號。* – Kaijiro