9

私の質問は、Java で Linux パイプを読み書きする最良の方法は何ですか? 私はすでに java.io.RandomAccessFile のように使用しています

   RandomAccessFile file = new RandomAccessFile("/dev/zap/16", "rw");

次に、それをワーカースレッドに渡します。ワーカースレッドは、2ms ごとに次のように読み取ります。

  byte[] buffer = new byte[16];
  file.read(buffer);

パイプから読み取りますが、一部のバイトが上書きされていると思われます。Linux(ubuntu)がパイプのバッファをどのように処理するか知っていますか?

4

3 に答える 3

11

私はこれを自分で試したことはありませんが、あなたのやり方は間違っていると感じています。Linux パイプは、定義上、先入れ先出し (FIFO) です。したがって、ランダムではなく、書き込みと同じ順序でのみバイトを読み取ることができるはずです。File代わりにノーマルを使用することをお勧めします。正常に動作するはずです。

于 2009-10-27T16:40:54.853 に答える
6

私の知る限り、パイプはJavaによって特別に処理されることはありません。書き込み用にファイルを開き、書き込みます。

パイプ内をシークできないため、パイプ内の何かを実際に「上書き」することはできません。同じ理由で、aRandomAccessFileを使用するのが最も賢明な選択ではありません (パイプは明示的にランダム アクセス ファイルではないため) 代わりにa を使用することをお勧めしFileOutputStreamます。

read()また、バッファがいっぱいになるまで読み取ることが保証されていないことにも注意してください! 単一バイトも読み取ることができ、その戻り値を確認し、場合によってはループして完全なバッファーを読み取る必要があります。

于 2009-10-27T16:42:02.760 に答える
0

書き込み後にフラッシュしていない可能性があると思うので、 OutputStream.flush() を頻繁に実行し、少なくともデータが通過しているかどうかを確認するために、読み取りが一度に1バイトになる可能性があります。たとえば、プロセス 1 で読み取り専用モード (FileInputStream) で名前付きパイプを開くことから始め、プロセス 2 で書き込みモード (FileOutputStream ) で開くと、プロセス 2 に書き込むものはすべてプロセス 1 で読み取られます。

も読む

http://www.tldp.org/LDP/lpg/node15.html
http://www.unixguide.net/unix/programming/2.10.5.shtml http://www.unixguide.net/unix/programming/ 2.10.6.shtml

于 2009-10-27T17:09:48.413 に答える