プロが教えるわが家の防犯対策術!

Javaを使って仮想環境(UserModeLinux)を操作しようとしています。
そこでまずUserModeLinux(UML)の標準出力を
Javaのコンソールに表示したいと考えているのですが、
それにはどのようなプログラムが必要でしょうか。
全体としては以下の図のようなプログラムを作成したいと考えています。
その中でまずClient側でUMLの標準出力を表示したいと考えています。
どんな些細なことでもかまいません。よろしくお願いします。

「仮想環境の標準出力をコンソールに表示する」の質問画像

A 回答 (3件)

Process process = null; の直後に process.getOutputStream() を実行すれば java.lang.NullPointerException が出るのは当然です。



> uml_processがUMLを起動するためのプロセス(端末)で
> processがUMLの内部(UML本体)であると私は考えています。

JavaのProcessクラスとして扱えるのはJavaプログラムから直接起動したプロセスだけです。UMLの仮想環境の中で動いているLinuxプロセスを、その外で動いているJavaプログラムから操作することはできないでしょう。

この回答への補足

> JavaのProcessクラスとして扱えるのはJavaプログラムから直接起動した
> プロセスだけです。UMLの仮想環境の中で動いているLinuxプロセスを、
> その外で動いているJavaプログラムから操作することはできないでしょう。
UML自体はJavaから起動したものであり、UML自体が仮想環境なのですが、
それでも無理でしょうか。

補足日時:2009/12/18 11:01
    • good
    • 0

> UML自体はJavaから起動したものであり、UML自体が仮想環境なのですが、


> それでも無理でしょうか。

Processクラス経由でできるのは、Javaから直接起動したプロセスであるuml_processの標準入出力を読み書きすることだけです。質問者さんがやりたいことをそれで実現できるかどうかは分かりませんし、その確認のためにUser Mode Linuxの環境を整えるつもりもありません。
process.getOutputStream()ではなくてuml_process.getOutputStream()は試してみたのでしょうか?
    • good
    • 0

普通の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の内容を出力したいと考えているのですが、
どこがおかしいでしょうか。

補足日時:2009/12/16 00:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!