我正在尝试获取Windows Server 2003计算机上正在运行的进程及其文件路径的列表。我正在使用以下代码来尝试做到这一点:
protected Map<String,String> getProcesses() { Map<String,String> processes = new HashMap<String,String>(); try { String line; Process p = null; // Windows if (OS.indexOf("win") >= 0) { p = Runtime.getRuntime().exec("wmic process get description,executablepath"); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); LOG.info("Entering while loop"); while ((line = input.readLine()) != null) { LOG.info("blah"); String[] array = line.split("\\s+"); if (array.length > 1) { processes.put(array[0], array[1]); } } LOG.info("Exited while loop"); input.close(); } } catch (Exception e) { e.printStackTrace(); } return processes; }
在while条件下,程序陷入无限循环。“ blah”和“退出循环时退出”永远不会输出到日志。我已经在win7本地计算机和输出信息的服务器上的命令提示符中都运行了命令。我还在本地计算机上运行了上面的代码,它也可以正常工作。在过去三个小时的搜寻中,似乎找不到Java和Windows Server 2003之间的问题。任何帮助将非常感激。
您需要先获取并关闭您的,OutputStream然后才能使用InputStream。这将向您确认已开始的过程已经完成向该过程发送输入(在这种情况下,没有输入)。
OutputStream
InputStream
p.getOutputStream().close();
请记住,在Process对象上,getInputStream()输入来自流程的输出流,而getOutputStream()输出则进入流程的输入流。
Process
getInputStream()
getOutputStream()