首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Runtime.exec()

Java Runtime.exec()
EN

Stack Overflow用户
提问于 2011-12-22 04:14:03
回答 3查看 62.5K关注 0票数 21

我可以从命令行运行此命令,没有任何问题(验证脚本将执行):

代码语言:javascript
复制
c:/Python27/python ../feedvalidator/feedvalidator/src/demo.py https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators 

在java中,如果我省略了URL参数,只需这样做:

代码语言:javascript
复制
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" };
Runtime r = Runtime.getRuntime();
Process p = r.exec(args1);

它工作得很好。如果我对参数使用某些URL,例如:

代码语言:javascript
复制
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" , "http://www.intertwingly.net/blog/index.atom"};
// or 
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" , "http://www.cnn.com"};

它也工作得很好。

但是如果我使用这个特定的URL https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators,那么脚本就会挂起(java等待这个过程完成)。我不知道为什么它只能在命令行中运行,而不能在java程序中运行。我尝试在URL参数两边添加引号,但也不起作用。我在URL中没有看到任何我认为需要转义的字符。

完整代码:

代码语言:javascript
复制
String urlToValidate = "https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators";

String[] args1 = {"c:/Python27/python", "C:/Documents and Settings/vhaiswcaldej/DAS_Workspace/feedvalidator/feedvalidator/src/demo.py", urlToValidate };
System.out.println(args1[0] + " " + args1[1] + " " + args1[2]);

Runtime r = Runtime.getRuntime();
Process p = r.exec(args1);
BufferedReader br = new BufferedReader(new InputStreamReader(
p.getInputStream()));
int returnCode = p.waitFor();
 System.out.println("Python Script or OS Return Code: " + Integer.toString(returnCode));
if (returnCode >= 2) {
    .out.println("OS Error: Unable to Find File or other OS error.");
    }

String line = "";
while (br.ready()) {
     String str = br.readLine();
     System.out.println(str);
     if (str.startsWith("line")) {
     //TODO: Report this error back to test tool.
     //System.out.println("Error!");
     }
     }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-22 06:03:40

您需要排出进程的输出和错误流,否则当执行的程序产生输出时,它将阻塞。

Process documentation

由于一些本机平台仅为标准输入和输出流提供有限的缓冲区大小,未能及时写入输入流或读取子进程的输出流可能会导致子进程阻塞,甚至死锁。

票数 19
EN

Stack Overflow用户

发布于 2011-12-22 06:06:35

阅读(并关闭) p.getInputStream()p.getErrorStream()

例如:

代码语言:javascript
复制
// com.google.common.io.CharStreams
CharStreams.toString(new InputStreamReader(p.getInputStream()));
CharStreams.toString(new InputStreamReader(p.getErrorStream()));
票数 7
EN

Stack Overflow用户

发布于 2012-01-29 04:53:24

在Java中,人们经常会被exec例程挂起所捕获。我也有一次被它迷住了。问题是,您尝试执行的进程可能(取决于很多事情)首先写入stdOut或stdErr。如果您以错误的顺序处理它们,exec将挂起。为了正确处理这个问题,你必须创建2个线程来读取simulteneously.和stdErr stdOut某事物如:

代码语言:javascript
复制
Process proc = Runtime.getRuntime().exec( cmd );

// handle process' stdout stream
Thread out = new StreamHandlerThread( stdOut, proc.getInputStream() );
out.start();

// handle process' stderr stream
Thread err = new StreamHandlerThread( stdErr, proc.getErrorStream() );
err.start();

exitVal = proc.waitFor(); // InterruptedException

...

out.join();
err.join();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8595748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档