いいえ、javax.xomm API が原因ではありません。Rxtx は、その API を介して使用することも、使用しないこともできます。
ただし、Rxtx の内部は少し異なり、奇妙で、いくつかのバグがあります。短いバージョンでは、これがどのように機能するかを示しています: タイムアウトとしきい値の 2 つのパラメーターを使用します。ソース コードによると、タイムアウトを 0 (なし) に設定し、しきい値を 1 (戻る前に少なくとも 1 バイトが必要) に設定すると、InputStream で定義されたブロック読み取りにより、通常どおりになります。
問題は、このように設定しても、現在の安定リリース (2.1.7r2) にバグがあることです。しきい値パラメータは常に 0 に設定されています。ソースコードから:
/* テスト ttyset.c_cc[ VMIN ] = しきい値; */ ttyset.c_cc[ VMIN ] = 0;
紛らわしいのは、これは 2004 年にも当てはまり、メーリング リストで報告されて修正されましたが、実際には修正されなかったか、再び再発したことです (回帰)。実際、何らかの理由で最初は見つけられなかった新しいバグ レポートがあります。最終的に、プレリリース パッケージのソース コードがスローされることがわかり、それ以外の場合は公開されていない変更ログが見つかりました (Web ページには、最後の安定バージョン以降の変更ログは表示されませんが、CVS で利用可能です)。
解決
- HEAD で修正されているため、最新のプレリリース バージョン (2.2 シリーズ) を使用するか、CVS からコンパイルできます。
次の行に沿って醜い回避策を作成します。
int read(InputStream in) throws IOException {
int b;
while ((b=in.read()) == -1) {
try { Thread.sleep(10); } catch (InterruptedException e) { }
}
return b;
}
次に、次のようread(in)
にしますin.read()
。
実は忘れないように、2年前にこれについてブログエントリを書きました。