bra*_*ido 9 java command-line sqlcommand process send
我在Windows XP上使用Java,并希望能够将命令发送到另一个程序,如telnet.我不想简单地执行另一个程序.我想执行它,然后在它运行后发送一系列命令.这是我想要做的代码,但它不起作用:(如果取消注释并将命令更改为"cmd",它将按预期工作.请帮助.)这是一个简化的示例.在生产中会发送更多的命令,所以请不要建议调用"telnet localhost".
try
{
Runtime rt = Runtime.getRuntime();
String command = "telnet";
//command = "cmd";
Process pr = rt.exec(command);
BufferedReader processOutput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));
String commandToSend = "open localhost\n";
//commandToSend = "dir\n" + "exit\n";
processInput.write(commandToSend);
processInput.flush();
int lineCounter = 0;
while(true)
{
String line = processOutput.readLine();
if(line == null) break;
System.out.println(++lineCounter + ": " + line);
}
processInput.close();
processOutput.close();
pr.waitFor();
}
catch(Exception x)
{
x.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
这看起来不错,因为它不会产生那么多输出,但您实际上应该在单独的线程中读取和写入,这样它就不会填满缓冲区并阻止您在到达下一步之前等待读取。
因此,如果达到刷新发送给它的命令的程度,请通过将您发送到其标准输入的文本通过管道传输到命令中来查明 Windows telnet 客户端是否支持从标准输入而不是控制台接收命令迅速的。
例如,echo dir c:\ | cmd使 cmd 运行,列出 c: 驱动器内容并退出,与dir c:\在控制台中键入的行为非常相似。但echo open localhost | telnet会导致 telnet 清除屏幕然后退出,而不是像在控制台中键入它一样。由于 telnet 需要屏蔽用户输入的密码,因此它很可能使用控制台 API,而不是从标准输入读取。它的帮助没有列出任何命令参数来告诉它从标准输入读取,所以也许您需要使用更适合脚本编写的 telnet 实现。
| 归档时间: |
|
| 查看次数: |
12265 次 |
| 最近记录: |