- ベストアンサー
仮想環境の標準出力をコンソールに表示する
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Process process = null; の直後に process.getOutputStream() を実行すれば java.lang.NullPointerException が出るのは当然です。 > uml_processがUMLを起動するためのプロセス(端末)で > processがUMLの内部(UML本体)であると私は考えています。 JavaのProcessクラスとして扱えるのはJavaプログラムから直接起動したプロセスだけです。UMLの仮想環境の中で動いているLinuxプロセスを、その外で動いているJavaプログラムから操作することはできないでしょう。
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
> UML自体はJavaから起動したものであり、UML自体が仮想環境なのですが、 > それでも無理でしょうか。 Processクラス経由でできるのは、Javaから直接起動したプロセスであるuml_processの標準入出力を読み書きすることだけです。質問者さんがやりたいことをそれで実現できるかどうかは分かりませんし、その確認のためにUser Mode Linuxの環境を整えるつもりもありません。 process.getOutputStream()ではなくてuml_process.getOutputStream()は試してみたのでしょうか?
- salsberry
- ベストアンサー率69% (495/711)
普通のUNIXのコマンド(catとか)だったら、java.lang.Processクラスの getOutputStream() getInputStream() getErrorStream() メソッドを使えばプロセスの標準入出力とJavaの入出力ストリームをつなげます。 ただ、User Mode Linuxの入出力が普通の標準入出力かどうかは分かりません。
補足
お返事ありがとうございます。 UserModeLinuxの入出力も普通の標準入出力のようです。 ただ以下のようなプログラムを作成したのですが、うまく動作しません。 ◎プログラム import java.io.*; public class UMLControl { public static void main(String[] args) throws IOException, InterruptedException{ // UMLの起動 String command[] = {"linux.uml", "ubd0=uml-root-hardy", "umid=uml1"}; Process uml_process = Runtime.getRuntime().exec(command); InputStream is = uml_process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = null; while ((line = br.readLine()) != null){ System.out.println(line); } // UMLプロセスへの標準入力を渡して、実行するためのソースコード // プロセスへのコマンドを書き込むための、BufferWiter型のフィールドを宣言する BufferedWriter bufferedwriter; Process process = null; bufferedwriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); // ユーザのコマンドの入力 BufferedReader input = new BufferedReader (new InputStreamReader(System.in), 1); System.out.print("UMLで実行するコマンドを入力してください>>"); String uml_control; // 文字列を入力する uml_control = input.readLine(); // コマンド(文字列)の入力 bufferedwriter.write(uml_control); bufferedwriter.flush(); // 標準入出力を表示するソースコード BufferedReader inputreader = new BufferedReader(new InputStreamReader(process.getInputStream())); // コマンドを読むバッファ char[] cbuf = new char[8192]; // 入力を読み込む int numRead = inputreader.read(cbuf); while(numRead != -1){ if(numRead <= 8192){ // 標準入出力の内容を表示する System.out.println(numRead); numRead = inputreader.read(cbuf); } } } } ◎実行結果 : UserModeLinuxの起動画面 : Exception in thread "main" java.lang.NullPointerException at UMLControl.main(UMLControl.java:19) 上記のようになってしまいます。 uml_processがUMLを起動するためのプロセス(端末)で processがUMLの内部(UML本体)であると私は考えています。 UserModeLinuxの起動画面の後に UserModeLinuxの内容を出力したいと考えているのですが、 どこがおかしいでしょうか。
補足
> JavaのProcessクラスとして扱えるのはJavaプログラムから直接起動した > プロセスだけです。UMLの仮想環境の中で動いているLinuxプロセスを、 > その外で動いているJavaプログラムから操作することはできないでしょう。 UML自体はJavaから起動したものであり、UML自体が仮想環境なのですが、 それでも無理でしょうか。