java给字符串运行进程exe
我试图从我的本地立交API获取OSM数据。有四个步骤来获取OSM数据。java给字符串运行进程exe
- 运行的二进制文件
/srv/osm3s/bin/osm3s_query
- 一旦osm3s_query运行时,你会看到这条消息
encoding remark: Please enter your query and terminate it with CTRL+D.
- 输入查询
<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/>
- 按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();
谢谢!有用! – user2775128
首先 - 这是一个非常脆弱的方式来与立交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()
来获得相关的流(在构建器,如果你喜欢,你可以去标准错误到标准输出)。
在读取和写入这些流时可能会陷入死锁 - 在很多情况下,您需要使用非阻塞IO类或创建单独的读写线程。
感谢您的回答。由于某些特殊原因,不允许通过HTTP进行查询。我接受了你的建议'ProcessBuilder.start()'和'getOutputSteam()'。 – user2775128
你有进程的输入流。你也可以得到输出流。 – Moira
您应该向输出流写入您的查询。 – minus
根据'Process'的Javadoc:“从1.5开始,ProcessBuilder.start()是创建Process的首选方法。” – slim