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」を端末に正常に送信します。この時点での端末からの応答は、「Enter Password:」です。

次に、パスワードを端末に送信しようとしましたが、送信する方法が見つかりませんでした。初めてと同じコマンドを使ってみましたが、exec コマンドは標準コマンドしか送信できません。

これは私の最初の投稿の問題でした: exec() コマンドでパスワードを送信していたので、試してみました

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

System.out.println; 私の関数では常に「Enter Password:」と表示されますが、これは私が探しているものではありません。

以前の投稿で提案された出力をフラッシュしようとしましたが、最初のコマンドが送信されてから2番目のコマンドが送信されるまでしばらく待ちますが、まだ何もありません。

誰かが私がそのようなことができる方法を知っていれば、それは素晴らしいことです.

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 に答える