【问题标题】:java give a string to running process exe [duplicate]java给正在运行的进程exe一个字符串[重复]
【发布时间】:2017-07-25 23:38:02
【问题描述】:

我试图从我的本地立交桥 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 结果

我的代码如下:

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

有人有想法吗?

【问题讨论】:

  • 你有进程的输入流。也可以获取输出流。
  • 您应该将查询写入输出流。
  • 根据 Process 的 Javadoc:“从 1.5 开始,ProcessBuilder.start() 是创建流程的首选方式。”

标签: java process centos overpass-api


【解决方案1】:
OutputStreamWriter output = proc.getOutputStream();
output.write(yourQuery);
output.write(4); // that's ctrl-d
output.flush();

【讨论】:

    【解决方案2】:

    首先——这是与 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


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

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

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

    【讨论】:

    • 感谢您的回答。由于某些特殊原因,不允许通过 HTTP 查询。我接受了您的建议 `ProcessBuilder.start()` 和 getOutputSteam()
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2016-03-19
    • 1970-01-01
    • 2014-07-08
    • 2013-03-04
    • 2013-01-20
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多