java给运行进程exe

时间:2017-07-25 07:55:41

标签: java process centos overpass-api

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

  1. 运行二进制文件/srv/osm3s/bin/osm3s_query
  2. osm3s_query运行后,您会看到此消息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结果
  5. 我的代码如下:

    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步挂起。我不知道如何给进程提供查询字符串。

    有人有想法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先 - 这是一种与Overpass API交互的非常脆弱的方式。由于Overpass是一个XML-over-HTTP API,并且Java有许多XML和HTTP库,因此在本机Java中有很多方法可以做到这一点。 OpenStreetMap提供了示例 - 例如http://wiki.openstreetmap.org/wiki/Java_Access_Example

这比调用外部命令更容易,也更强大。

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

对于运行进程,写入stdin并从stdout读取的一般情况,从Java 1.5开始,最好使用npm来创建ProcessBuilder

完成流程后,您可以使用ProcessgetInputStream()getOutputSteam()来获取相关的流(在构建器中,如果您愿意,可以让stderr转到stdout )。

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