在没有任何中间文件的情况下用Java创建GraphViz图

时间:2014-02-17 15:39:00

标签: java graphviz

我想使用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程序读取我之前由程序生成的String。

我该怎么办?

提前致谢!

1 个答案:

答案 0 :(得分: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在命令行读/写stdin / stdout:

$ 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