java 给 运行 进程 exe 一个字符串
java give a string to running process exe
我试图从本地立交桥 API 获取 OSM 数据。获取OSM数据有四个步骤。
- 运行二进制文件
/srv/osm3s/bin/osm3s_query
- 一旦 osm3s_query 为 运行ning,您将看到此消息
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();
首先——这是一种与立交桥交互的非常脆弱的方式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 类 或创建单独的线程来读取和写入。
我试图从本地立交桥 API 获取 OSM 数据。获取OSM数据有四个步骤。
- 运行二进制文件
/srv/osm3s/bin/osm3s_query
- 一旦 osm3s_query 为 运行ning,您将看到此消息
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();
首先——这是一种与立交桥交互的非常脆弱的方式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 类 或创建单独的线程来读取和写入。