- PR -

テキストエリアへのエラー文の出力

投稿者投稿内容
tanabo
常連さん
会議室デビュー日: 2003/04/24
投稿数: 34
投稿日時: 2004-11-09 17:52
setTextがOKだった場合には、
Runtime#execで返されるProcessオブジェクトの
waitForメソッドでコマンドの終了を待つ必要が
あると思います。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-11-09 18:05
そもそもエラー出力を求めているのに process.getInputStream() を
使っている時点でアウトです。
process.getErrorStream() に書き換えてみてください。
それとtanaboさんの仰っているwaitFor() も必要かもしれませんね。
あとは、インギさんの仰っているsetText() が本当に狙い通りなのか
も考えてみてください。
ループでまわしてsetText()するということは、前回のループ時に記述した
文字列を消して新たな文字列に書きかえるということです。
末尾に追加するならappend()を使うべきですね(改行処理も必要です)
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-11-09 18:21
Java 1.3 の頃だったかな…。NT系Windows で外部プロセスを起動すると止まってしまうという FAQ がありました。外部プロセスの標準出力、エラー出力の読み出しを行わないとバッファが詰まって外部プロセスの実行自体がブロックされてしまうのが原因でした。

・外部プロセスを起動したら、標準出力だけでなく標準エラー出力も吸い出してあげてください。(そもそも javac のエラーメッセージは、標準出力じゃなくて標準エラー出力に吐かれるんじゃないのかな?)

とりあえず、外部プロセスのブロッキングを予防するために、次の 2点を守ってください。

・標準出力, 標準エラー出力をスレッドを使用して非同期で読み出すこと。
・読み出しには BufferedReader#readLine() を使わないこと。

それから、外部プロセスがブロッキングされていないことを確認するために、正しいソースコードを与えた場合に .class ファイルが出来上がることを確認してください。
さく
会議室デビュー日: 2004/09/01
投稿数: 13
投稿日時: 2004-11-09 19:32
writeに与えられるbyte配列が完全な文字列であることを想定している怪しいコードですが、以前作ったTextPaneに文字を吐くPrintStreamです。
こんな感じのをSystem.setErrに喰わせてやればいけるんじゃないでしょうか。

コード:
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

public class TextPanePrintStream extends PrintStream {

	public TextPanePrintStream(JTextPane target, AttributeSet as) {
		super(new TextPaneOutputStream(target, as));
	}

	public TextPanePrintStream(JTextPane target) {
		super(new TextPaneOutputStream(target, target.getCharacterAttributes()));
	}
 
	public AttributeSet getAttributeSet() {
		TextPaneOutputStream os = (TextPaneOutputStream)out;
		return os.getAttributeSet();
	}

	public void setAttributeSet(AttributeSet as) {
		TextPaneOutputStream os = (TextPaneOutputStream)out;
		os.setAttributeSet(as);
	}
}

class TextPaneOutputStream extends ByteArrayOutputStream {

	private final JTextPane target;
	private AttributeSet attributeSet;

	TextPaneOutputStream(JTextPane target, AttributeSet as) {
		super();
		this.target = target;
		setAttributeSet(as);
	}

	public void write(byte[] b, int off, int len) {
		String s = new String(b, off, len);
		Document doc = target.getDocument();
		try {
			doc.insertString(doc.getLength(), s, attributeSet);
		} catch (BadLocationException e) {
			throw new RuntimeException(e);
		}
	}

	AttributeSet getAttributeSet() {
		return attributeSet.copyAttributes();
	}

	void setAttributeSet(AttributeSet as) {
		this.attributeSet = as.copyAttributes();
	}
}


未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-11-09 20:16
System#setErr(PrintStream err) とか言ってる人達は何か勘違いしていませんか?
自プロセスの標準エラー出力を切り替えても解決しないので注意 > 元質問者
さく
会議室デビュー日: 2004/09/01
投稿数: 13
投稿日時: 2004-11-09 20:33
引用:

未記入さんの書き込み (2004-11-09 20:16) より:
System#setErr(PrintStream err) とか言ってる人達は何か勘違いしていませんか?



ぐは(確認中)

単にウィジェットにprintするという趣旨だと誤認していました。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-09 23:51
JavaFAQ : Java に関するよくある質問とその回答集
S103 外部コマンド呼出し
http://www.gimlay.org/~javafaq/javafaq.html#S103
ノリ
常連さん
会議室デビュー日: 2004/09/24
投稿数: 32
投稿日時: 2004-11-10 00:03
皆さんいろいろな回答ありがとうございます。
早速試して見たいと思います。

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