0

可能重复:
如何在不将其作为标准命令的情况下将字符串发送到终端?

我已经发布了一个关于这个主题的问题,但是过了一会儿,我的问题仍然没有解决。Marko Topolnik 向我展示了一些可能的答案,但我仍然被阻止。

这是我的问题:

我有一个 Java 程序,在某些时候需要连接到外部程序。为此,我实现了以下功能:

public void login(String password) throws IOException
{
    final Process p = Runtime.getRuntime().exec("p4 login");
    final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    System.out.println("going to read line");

    System.out.println(in.read());
    System.out.println("read line");
    new PrintWriter(p.getOutputStream(),true).println(password);
    System.out.println("password sent");
    String line;
    while ((line = in.readLine()) != null)      
    {      
        System.out.println("printing line");
        System.out.println(in.read());
        System.out.println(line);
        System.out.println("printed line");
        if (line.startsWith("User")) loggedIn=true;
    }        
    loggedIn=false;
}

该函数成功向终端发送“p4 login”。此时终端的响应是:“输入密码:”

然后,我尝试将密码发送到终端,但我找不到这样做的方法。我曾尝试使用与第一次相同的命令,但 exec 命令只能发送标准命令。

这是我第一篇文章的问题:我使用 exec() 命令发送密码,这就是我尝试使用的原因

new PrintWriter(p.getOutputStream()).println(password); 

System.out.println(s); 在我的功能中始终显示“输入密码:”,这不是我想要的。

我已经尝试刷新输出,这是在我的旧帖子中向我建议的,在发送的第一个命令和第二个命令之间等待一段时间,但仍然没有。

如果有人知道我怎么能做这样的事情,那就太好了。

4

1 回答 1

0

这段代码将永远循环,但它会打印出程序发送给您的任何内容:

public boolean login(String password) throws Exception {
  final Process p = Runtime.getRuntime().exec("p4 login");
  final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  final char[] buf = new char[20];
  System.out.println(new String(buf, 0, in.read(buf)));
  System.out.println("Sending password");
  new PrintWriter(p.getOutputStream(),true).println(password);
  System.out.println("Password sent");
  int read;
  while ((read = in.read(buf)) != -1) {
    System.out.print(new String(buf, 0, read));
    System.out.flush();
  }
  return false;
}
于 2012-04-27T08:27:46.543 回答