stdin(A) stdin(B)
--------------------> ------------------->
console stdout/stderr(D) wrapper stdout/stderr(C) server program
<-------------------- <-------------------
例えばwrapperが上記のような構造なら、(C)を直接(D)へ垂れ流すのではなく一旦wrapperで蓄積し(A)で1行入力した直後に蓄積した内容を(D)へ一気に吐き出すとような工夫をすると比較的手軽にお望みのことに概ね近いことができるような気はしますが・・・当然ながら(D)へ吐き出した後次の入力が完了するまで利用者からは(C)が見えないので使い勝手は良いとは言えません。
使い勝手をもっと良くしたい場合
- (D)はファイルへ吐き出し、別のterminalでtail -fなどで観察することにする
- curses
Linuxのcursesライブラリーを駆使して、文字単位での制御(カーソルを左端のカラムへ移動するとか入力中の行をクリアするとか・・・)を前提でstdin/stdout/stderrが乱れないようにする方法です。Javaでも可能な気はしますがcursesライブラリー前提で、JNA/JNIでネイティブライブラリーとのやり取りが必要な気がするので、どうしてもということならCで作ってしまった方がよほど気持ちよく作れる気がします。
- フロントエンドプロセッサー的なものを前提にする
例えばscreenやemacs上のshellモードなど。screen前提とするなら入力用の画面と出力用の画面を一つのterminalの中で分割できると思います。Javaのプログラム上からは出力と入力のttyデバイス名(/dev/ttyaとか)を意識しそれをopenしてI/Oをするような構造になると思いますが、それさえやっておけばあとはscreen側でttyデバイスに応じた分割画面上とのi/oを良きに計らってくれると思います。
記憶が曖昧ですがemacsのshellモードを使うと上記のようなことを一切しなくても入力中の行が常にstdout/stderrの最後の行の次に自動表示してくれた記憶があります。それが使えれば今のままでもOKということになるかも知れません。
- あきらめてGUIで作る(swing/JavaFX)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。