- PR -

OutputStreamのStringへの変換

1
投稿者投稿内容
ひで
常連さん
会議室デビュー日: 2005/04/27
投稿数: 41
お住まい・勤務地: 神戸
投稿日時: 2005-07-12 11:31
とあるCのプログラムの標準出力をStringの変数に格納し、表示する
プログラムを書いていますがうまく行きません。

Cのプログラム:c:\test.exe
Cの実行結果:test

/* Java */
String[] command = { "c:\\test.exe" };
ProcessBuilder builder = new ProcessBuilder (command)

Process process = builder.start();

OutputStream stream = process.getOutputStream()

System.out.println(stream.toString());

Javaの実行結果
java.io.BufferedOutputStream@de6ced

"test"と出力されるにはどのようにすればいいでしょうか。
宜しくお願いします。



[ メッセージ編集済み 編集者: ひで 編集日時 2005-07-12 11:48 ]
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2005-07-12 12:18
Javaには、「なんでもかんでもクラス(オブジェクト)で処理する」
という特徴があります。予約語も50個ほどありますが、それ以外の
膨大なライブラリはクラスで表現しています。ここまで
クラスにこだわる必要ないんじゃないかと思うくらいです。

さて、質問の件ですが、2つほどポイントがあります。

・標準出力の取得の方向(1)
・取得するにもメソッドを使用する(2)

引用:

ひでさんの書き込み (2005-07-12 11:31) より:
OutputStream stream = process.getOutputStream()



(1)これはおそらく
InputStream stream = process.getInputStream()
ですね。


引用:

System.out.println(stream.toString());

Javaの実行結果
java.io.BufferedOutputStream@de6ced



なんでもかんでもオブジェクトで・・・という点で、
Javaはファイルの入出力をするにもコマンドやステートメントではなく
オブジェクトを使用します。

InputStreamというオブジェクト(クラス)を使用するのですが、
これで生成したstreamというインスタンス変数は、あくまで
「ファイル入力をするためのオブジェクト」であって、これ自身に
データが入っているわけではありません。
おそらく間違いのもとになったのは、Javaには「すべての
クラス(オブジェクト)はjava.lang.Objectを先祖に持つ」
という特徴があり、これがtoStringメソッドを持っている
ためだと思います。で、このtoStringは、あくまで
[InputStream]の内部表現を文字列として表示しているに
すぎません。

データを取得するには、readというメソッドを利用します。

テストは行っていないのですが、コーディングするとしたら
以下のようになると思います。(1000文字を超えるとエラーに
なります)

byte buffer = new byte[1000];
stream.read(buffer);
System.out.println(new String(buffer));



(わかりやすく解説するために、用語の使い方が厳密ではありません。
ご了承ください)
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-07-12 12:27
「外部プログラムによる標準出力を受け取って○○したい」という話はたくさんの方が話題にされていますので、検索ワードを工夫して検索されるとよいでしょう。

たとえば最近では以下のようなスレッドがありました。

BufferedReaderのreadLineについて
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21046&forum=12


[ メッセージ編集済み 編集者: びしばし 編集日時 2005-07-12 12:27 ]
ひで
常連さん
会議室デビュー日: 2005/04/27
投稿数: 41
お住まい・勤務地: 神戸
投稿日時: 2005-07-12 13:14
以下のようにすることで"test"と表示することができました。
アドバイスありがとうございました。

ProcessBuilder builder = new ProcessBuilder(command);
Process p = builder.start();
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String strResult = br.readLine();
System.out.println("実行結果:" + new String(strResult));
1

スキルアップ/キャリアアップ(JOB@IT)