Meine Frage ist, was ist der beste Weg, um eine Linux-Pipe in Java zu lesen / schreiben? Ich verwende bereits die java.io.RandomAccessFile wie
%Vor%und übergibt es dann an den Worker-Thread, der es alle zwei ms als
liest %Vor%Es liest es von Pipe, aber ich vermute, dass einige Bytes überschrieben werden. Wissen Sie, wie Linux (Ubuntu) den Puffer für Pipes behandelt?
Ich habe das nie selbst versucht, aber was du tust, fühlt sich einfach falsch an. Linux-Pipes sind per Definition First-In-First-Out (FIFO). Daher sollten Sie Bytes nur in der Reihenfolge lesen können, in der Sie sie geschrieben haben - nicht zufällig. Ich würde vorschlagen, stattdessen ein normales File
zu verwenden und es sollte gut funktionieren.
Pipes werden, soweit ich weiß, von Java nicht besonders behandelt. Sie öffnen einfach die Datei zum Schreiben und Schreiben.
Sie können nichts in einer Pipe wirklich "überschreiben", da Sie nicht in einer Pipe suchen können. Aus dem gleichen Grund ist ein RandomAccessFile
nicht die klügste Wahl (da eine Pipe explizit nicht eine Direktzugriffsdatei ist). Ich würde vorschlagen, stattdessen ein FileOutputStream
zu verwenden.
Beachten Sie auch, dass read()
nicht garantiert gelesen wird, bis der Puffer voll ist! Es kann auch ein einzelnes Byte lesen und Sie müssen seinen Rückgabewert überprüfen und möglicherweise eine Schleife ausführen, um den vollen Puffer zu lesen.
Ich denke, Sie können nicht nach dem Schreiben zu flush, so OutputStream.flush () oft und lesen kann ein Byte zu der Zeit, zumindest um zu sehen, ob Ihre Daten durchkommen. z.B. Um mit dem Öffnen einer benannten Pipe im schreibgeschützten Modus (FileInputStream) in process1 zu beginnen, öffnen Sie sie im schreibmodus (FileOutputStream) in process2, sodass alles, was Sie in process2 schreiben, in process1 eingelesen wird.
lesen Sie auch
Tags und Links java named-pipes pipe