java 给 运行 进程 exe 一个字符串

java give a string to running process exe

我试图从本地立交桥 API 获取 OSM 数据。获取OSM数据有四个步骤。

  1. 运行二进制文件/srv/osm3s/bin/osm3s_query
  2. 一旦 osm3s_query 为 运行ning,您将看到此消息encoding remark: Please enter your query and terminate it with CTRL+D.
  3. 输入您的查询<query type="node"><bbox-query n="51.0" s="50.9" w="6.9" e="7.0"/><has-kv k="amenity" v="pub"/></query><print/>
  4. ctrl+D 并获得 OSM 结果

我的代码如下:

try
    {            
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("/srv/osm3s/bin/osm3s_query");
        InputStream stderr = proc.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        while ( (line = br.readLine()) != null)
            System.out.println(line);
        int exitVal = proc.waitFor();
        System.out.println("Process exitValue: " + exitVal);
    } catch (Throwable t)
      {
        t.printStackTrace();
      }

在显示消息 encoding remark: Please enter your query and terminate it with CTRL+D. 后,进程将挂起在第 2 步。我不知道如何为进程提供查询字符串。

有人知道吗?

OutputStreamWriter output = proc.getOutputStream();
output.write(yourQuery);
output.write(4); // that's ctrl-d
output.flush();

首先——这是一种与立交桥交互的非常脆弱的方式API。由于 Overpass 是一个 XML-over-HTTP API,并且 Java 有很多 XML 和 HTTP 库,所以在原生 [=30] 中有很多方法可以做到这一点=]. OpenStreetMap 提供示例 - 例如 http://wiki.openstreetmap.org/wiki/Java_Access_Example

这可能比调用外部命令更容易,当然也更可靠。

还有更高级别的 Java 库:http://wiki.openstreetmap.org/wiki/Frameworks


对于 运行 进程的一般情况,写入其标准输入并从其标准输出读取,因为 Java 1.5 最好使用 ProcessBuilder 创建您的 Process.

一旦你有了一个进程,你可以使用getInputStream()getOutputSteam()getErrorStream()来获取相关的流(在构建器中,如果你愿意,你可以让stderr去到标准输出)。

读取和写入这些流时可能会陷入死锁 - 在许多情况下,您需要使用非阻塞 IO 类 或创建单独的线程来读取和写入。