微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

执行java process命令时没有任何反应

如何解决执行java process命令时没有任何反应

为什么我不能运行这个:

process = Runtime.getRuntime().exec(new String[]{"cmd.exe","/c","\"C:\\Program Files\\Gdal\\bin\\gdal\\apps\\ogr2ogr.exe\" -f \"" + "ESRI Shapefile" + "\" \"" + "C:\\Temp\\world.shp" +"\" PG:\"host=" + MainDialog.host + " user=" + MainDialog.dbUser + " password=" + MainDialog.dbPassword + " dbname=" + MainDialog.dataBase + "\" \"" + layerName + "\" -dim " + coordformat});

导致命令:

"C:\Program Files\Gdal\bin\gdal\apps\ogr2ogr.exe" -f "ESRI Shapefile" "C:\Temp\world.shp" PG:"host=127.0.0.1 user=puser password=pwd dbname=db1" "world" -dim XY

此命令可以在 Windows cmd 终端中执行,没有任何问题... 但是在运行java进程时没有任何反应,没有错误代码

解决方法

String[] 用于 exec(cmd) 调用要容易得多,因为这可以避免参数值的标点符号/转义问题。像这样尝试:

String [] cmd = new String[]{
    "C:\\Program Files\\Gdal\\bin\\gdal\\apps\\ogr2ogr.exe","-f","ESRI Shapefile","C:\\Temp\\world.shp","PG:\"host=" + MainDialog.host + " user=" + MainDialog.dbUser + " password=" + MainDialog.dbPassword + " dbname=" + MainDialog.dataBase + "\"",layerName,"-dim",coordformat
    };
Process p = Runtime.getRuntime().exec(cmd);
int rc = p.waitFor();
,

Runtime.exec 已过时。请改用 ProcessBuilder。这不仅会为您的流程提供更大的灵活性,还会消除对所有这些额外引号的需要。

如果许多进程填满了它们的输出或错误缓冲区并且没有其他进程消耗它,它们就会挂起。

如果您不关心进程的输出,只需使用 inheritIO() 确保没有任何阻塞:

ProcessBuilder builder = new ProcessBuilder(
    "C:\\Program Files\\Gdal\\bin\\gdal\\apps\\ogr2ogr.exe","PG:host=" + MainDialog.host,"user=" + MainDialog.dbUser,"password=" + MainDialog.dbPassword,"dbname=" + MainDialog.dataBase,coordformat);

builder.inheritIO();

process = builder.start();

注意,没有一个参数需要被引用,事实上也不能被引用。

如果你关心进程的输出,你可以手动执行inheritIO()所做的一些步骤:

ProcessBuilder builder = new ProcessBuilder(
    "C:\\Program Files\\Gdal\\bin\\gdal\\apps\\ogr2ogr.exe",coordformat);

builder.redirectError(ProcessBuilder.Redirect.INHERIT);
builder.redirectInput(ProcessBuilder.Redirect.INHERIT);

process = builder.start();

try (InputStream processOutput = process.getInputStream()) {
    // ...
}
,

感谢大家的帮助!

使用时

"ogr2ogr.exe"

代替 "C:\Program Files\Gdal\bin\gdal\apps\ogr2ogr.exe"

在 progressBuilder 中,它可以工作...

它使用设置为 C:\Program Files\Gdal\bin\gdal\apps 的系统路径 奇怪的是,它与旧版本的 ogr2ogr.exe 一起工作,放在 C:\Program Files\OSGeo4W64\bin 中。

我不明白....

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。