バッファリングされていないサブプロセスから出力を読み取る簡単な方法はありますか? JavaからCプログラムを呼び出そうとしていますが、パイプに接続されている場合はstdoutブロックバッファリングされ、コンソールに接続されている場合のみラインバッファリングされているようです。C プログラムを変更できません。
プログラムがコンソールに接続されていると思わせる方法はあるのでしょうか? Linuxでも機能するソリューションのボーナスポイント。
これは優れた解決策ではありませんが、ランタイム ライブラリはおそらくシリアル ポートをバッファリングしないため、どうしても必要な場合は、com0comまたはその派生物などのヌル モデム エミュレータを使用できます。
環境変数BUF_1_=0を使用してみましたか?
それを行う最良の方法は、スレッドを使用して出力を読み取ることです。
私がすることは、プロセスからの入力(process.getInputStream())と出力を格納したい出力を与えるCallable(Runnableも機能します)を使用することです。StdErrについても同じことを行う必要があります。結果の出力は、好きなものを使用して読み取ることができます。
public Object call () throws IOException {
int bytesRead;
byte[] b = new byte [ this.maxBlockSize ];
try {
while ( ( bytesRead = this.input.read ( b ) ) != -1 ) {
this.output.write ( b, 0, bytesRead );
}
} finally {
if ( this.output != null ) {
this.output.close ();
}
}
return null;
}
わかった -
1) 「ラインバッファ入力」は、コンソールモードプログラムの一般的なイディオムであり、元の Unix およびシリアルモード VTxx 端末にさかのぼります。
2) 「生の、バッファリングされていない」I/O (一度に 1 行ずつではなく、一度に 1 キーストローク) を読み取ることができますが、詳細は OS 固有です。特定の OS で行う必要があることは、ほぼ確実に Java から実行できます。
3) Windows キーボードで「矢印アップ」キーまたは「ページダウン」キーをインターセプトできるようにしたいようです。おそらく、ゲームをプレイするため、またはコンソール モードのユーザー インターフェイスと対話するためです。
4) いくつかのオプションがあります。検討したいのは、テストに使用される「ロボット」API です。
それだけでは不十分な場合は、Java プログラムを C プログラムと対話させる方法について詳しく教えてください (また、プラットフォームが実際に Windows であり、DOS プロンプトであるかどうかを明確にしてください)。
c の出力をファイルにリダイレクトしてから、Java の別のスレッドからファイルを末尾にすることができます。
org.apache.commons.io.input.Tailer