2017-03-03 5 views
1

Eclipse経由でスクリプトを介して次のコマンドを実行します。Eclipse IDE経由でJavaコマンドを持つスクリプトを実行して、出力を確認してプログラムとやりとりする方法はありますか?

私はそれが好きで実行
java -cp /home/pallavi/KeplereeWorkspace/trace/target/classes:/home/pallavi/git/thesis-2016/Soot_Instrumentation/sootOutput org.employee.Employee 

Runtime.getRuntime().exec("./src/main/resources/Intrumentation_Execution.sh"); 

プログラム「従業員」とは、ユーザーがオプションを選択する必要があり、異なる出力/プロセスが発生する可能性があることを意味し、対話型のプログラムです。私がBufferedReaderを使用している場合、私は最初の印字行しか見ることができず、ユーザー入力は与えられません。ターミナルからIntrumentation_Execution.shを実行すると、すべて正常に動作します。しかし、別のJavaプログラムで実行する必要があります。

私は実行クラスのEmployeeのmainメソッドを呼び出すことはできません。私はEmployeeが単なるテストケースである自動化されたツールを構築しているからです。

答えて

1

シェルスクリプトから開始されるJavaプロセスを話すブリッジを作成します。以下のような何か:

startreader.sh

#!/bin/bash 
echo "" > inputbridge.txt 
tailf inputbridge.txt | java SampleRead 

SampleRead.java

import java.util.Scanner; 

public class SampleRead { 
    public static void main(String [] args) { 
     Scanner scanner = new Scanner(System.in); 
     int readValue = 0; 
     while((readValue = scanner.nextInt()) != 5) { 
      System.out.println("Send me something other than " + readValue); 
     } 
     System.out.println("Good job. Bye"); 
    } 
} 

NumberGenerator.java

import java.io.FileWriter; 
import java.io.IOException; 
import java.util.Scanner; 
public class NumberGenerator { 
    public static void main(String [] args) throws IOException { 
     ProcessBuilder processBuilder = new ProcessBuilder("./startreader.sh"); 
     Process process = processBuilder.start(); 
     Scanner processStreamReader = new Scanner(process.getInputStream()); 
     String processInputString = null; 
     do { 
      try(FileWriter fileWriter = new FileWriter("inputbridge.txt", true)) { 
       fileWriter.write(((int)(Math.random() * ((10 - 1) + 1)) + 1) + "\n"); 
      } catch(IOException e) { 
       e.printStackTrace(); 
      } 
      processInputString = processStreamReader.nextLine(); 
      System.out.println(processInputString); 

     } while(processInputString.startsWith("Send me something other than")); 
    } 
} 

を実行する手順:

  1. コンパイルSampleRead.javaNumberGenerator.java
  2. startreader.sh
  3. 実行java NumberGenerator

出力

[[email protected] java]$ java NumberGenerator 
Send me something other than 1 
Send me something other than 6 
Send me something other than 8 
Send me something other than 4 
Good job. Bye 
[[email protected] java]$ cat inputbridge.txt 

1 
6 
8 
4 
5 
のための実行権限を提供します

この仕組み: 橋をNumberGeneratorSampleReadstartreader.shによって生成されたinputbridge.txtファイルです。 NumberGeneratorを実行するとstartreader.shを実行し、inputbridge.txtを生成して空にします。 startreader.shの次の段階は、をinputbridge.txtファイルにします。このファイルに書き込まれた新しい行は、tailfプロセス経由でSampleReadへの入力になります。

それは価値5の値5が出力されます「私に何かを送信...」読まれる以外の場合NumberGeneratorがランダムに番号を選び、それがSampleReadで受信します、inputbridge.txtに書き込むことによってSampleReadに送信し、チェックNumberGeneratorからProcessInputStreamまで

このアプローチは、シェルスクリプトの実行後にJavaプロセスの存在を確認することで強化する必要があります。さらに、プロセスは手動で終了するまで終了しません。したがって、tailfは、実行を終了するタイミングを知るためにNumberGenerator種類の通信プロトコルを持つ別のプロキシJavaアプリケーションに置き換えることができます。 Javaプロキシアプリケーションを開発する場合は、ファイルの代わりにSocketsを使用することを検討してください。

+0

こんにちは、遅い回答をおかけして申し訳ありません。しかし、私は彼女に指示したのと同じ出力を得ることはできません。私の出力は何も表示されません任意の番号を入力する場合は、空白の画面です。私が間違っている場所を教えてください –

+0

サンプルコードを実行しようとしていますか? –

+0

はいコードを実行しようとしています –

関連する問題