2017-07-10 10 views
1

コマンドプロンプトを起動し、そこにいくつかの資格情報を記録しようとしています。このために私は以下のアプローチをとっています:プロセスがjavaで終わり、制御が先に進まない

public static void main(String[] args) throws InterruptedException { 
    // init shell 

    ProcessBuilder builder = new ProcessBuilder("cmd"); 
    Scanner scanner = null; 
    BufferedWriter writer = null; 
    try { 

     scanner = new Scanner (System.in); 

     System.out.print("Enter your MS ID : "); 
     String user = scanner.nextLine(); 

     System.out.print("Enter your MS Password : "); 
     String pass = scanner.nextLine(); 

     Process p = builder.start(); 
     writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 

     writer.write("oc logout"); 
     writer.newLine(); 
     writer.flush(); 

     writer.write("oc login <private-url>"); 
     writer.newLine(); 
     writer.flush(); 

     writer.write(user); 
     writer.newLine(); 
     writer.flush(); 

     writer.write(pass); 
     writer.newLine(); 
     writer.flush(); 



//Writing this will end the process after login is done 
//   writer.write("exit"); 
//   writer.newLine(); 
//   writer.flush(); 

     Thread t = new Thread(new Runnable() { 
      public void run() { 

       try(BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) { 
        ; 
        String line; 
        while ((line = br.readLine()) != null) { 
         System.out.println(line); 
        } 
       } catch (java.io.IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     t.setDaemon(true); 
     t.start(); 
     p.waitFor(); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 
    finally { 
     scanner.close(); 
    } 


} 

しかし私がプログラムを実行すると、それは終了しません。 Eclipseでcmdを実行すると、明示的にプログラムを終了する必要があります。たぶん私は何かを見逃しています。どんな助けでも大歓迎です。それは単に目的のために動作しますが、終了しないので、私は自分のプログラムに統合し、そうすることができません。

+0

なぜスレッドが必要ですか?そして、いつ終了しますか? – Azeem

+0

コンソールへのcmd出力を取得するためのものです。メインスレッドでこれを行うと、最初の出力が得られます。入力をコンソールに渡した後ではありません。私はそれがコンソールに出力を入れていないので、それを終了させて​​いません。 –

+0

@MohitSharmaすべての書き込みステートメントの後にフラッシュする必要はありません。クローズライター(閉鎖時にフラッシュされます) – Antoniossss

答えて

0

writerを閉じないでください!実行可能なタスクで

あなたのループは、複数の入力があるかどうかを読者に尋ねる:

while ((line = br.readLine()) != null) { ... } 

メインスレッドでwriterがクローズされていない限り、これは常にそうです。だから、簡単な解決策のために最後の書き込み操作の後に単純なwriter.close()を入れてください。

try (Scanner scanner = ...) { ... } 
try {Reader reader = ...) { ... } 
try {Writer writer = ...) { ... } 

これらの記述は、締切automaticallyを処理します:

より良い解決策は、あなたは以下の通りなど読者、作家、スキャナを、開く必要のJava 7で導入されたtry-with-resources statementを、使用することです君は。そして、副作用として、あなたのコードをもっと読みやすくします。

警告:その時点後には入力がもはや読み取ることができないように、また、標準入力を閉じSystem.inに接続されているScannerを閉じます。それがコードの一部では適切でない場合は、スキャナを閉じないでください。

+0

私はtry-withリソースを使ってみましたが、まだプロセスを終了しませんでしたが、ライターに "exit"コマンドを入力しようとすると終了しました。どのような他のアイデアを世話をする必要があります。新しいコードで更新された投稿。 –

+0

"try-withリソースを使用しようとしましたが、プロセスを終了しません" =>それはできません。あなたのコードに 'try(BufferedWriter writer = ...){...}'ステートメントがある場合、プロセスは確実に終了します。私はそれをテストしました! – Seelenvirtuose

関連する問題