通过Java应用程序将管道传递给shell命令

时间:2018-03-06 01:32:27

标签: java windows shell

我需要知道某个进程(java.exe)在java webapp中使用了多少内存。

我尝试了以下内容:

Process proc = Runtime.getRuntime().exec("tasklist /v | find \"java.exe\"");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader errInput = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

但是这会返回以下内容:

错误:参数/选项无效 - “|” 输入“TASKLIST /?”用法。

我知道这是因为管道是一个shell特性,在传递给shell之前由Java解析。

我也尝试过:

String[] procString = {
    "cmd",
    "/c",
    "tasklist /v | find \"java.exe\""
};
Process proc = Runtime.getRuntime().exec(procString);

但是这不会给BufferedReader返回任何内容。

有没有办法将正确的输出输入到webapp中?

1 个答案:

答案 0 :(得分:0)

在exec()函数返回之前,必须定期使用stdInput和errInput流。只要缓冲区已满,exec()函数就会阻塞。也就是说,当没有空间写入缓冲区时,通过exec()函数的命令不会继续。要解决此问题,请在另一个线程中的每个缓冲区已满后读取缓冲区。

对于进入Java程序的人来说,这是一个错误。如果已定义流,则必须使用它(通过读取功能)