2015-07-23 11 views
5

Ich erstelle eine schnelle Brücke zwischen zwei separaten Programmen.Ist Java FileInputStream Sperrdatei zum Schreiben

Ein Programm schreibt in eine Datei, während mein Programm gleichzeitig davon liest.

Es scheint, dass, sobald ich den ersten Lesevorgang anrufe, das Schreiben vollständig blockiert ist.

Warum tritt dies auf und was ist die Problemumgehung?

// Create Named Pipe 
Runtime.getRuntime.exec("mkfifo /tmp/mypipe") 

val stream = new FileInputStream("/tmp/mypipe") 

val in = new BufferedReader(new InputStreamReader(stream)) 

// File opened for reading. No blocking at this point. 

while (true) { 

    println(in.readLine()) 

    // File read. Now blocking. 

} 

Update:

Diese Datei ist eigentlich ein Named Pipe mit mkfifo /tmp/mypipe erstellt. Ich versuchte es mit einem normalen File und es funktionierte gut - alle Daten angezeigt.

Ich benutze eine Named Pipe, weil ich nicht die Festplatte IO Overhead will.

+0

Können Sie das andere Programm auch zeigen? – Vlad

+1

@Vlad ich habe keine Quelle und es ist nicht öffentlich. Alles was es tut, ist kein Lesen zu schreiben. Die While-Schleife und das Fehlen eines ordnungsgemäßen Schließens ist einfach. – BAR

Antwort

6

Wenn ich wetten müsste, würde ich sagen, dass es ein Pufferproblem ist.

Anfangs dachte ich, dass BufferedReader versuchen könnte, seinen gesamten Puffer zu füllen, aber es sieht aus wie es glücklich ist, solange es etwas liest. Siehe die fill() Methode.

Wenn Sie readLine() verwenden, gibt es auch die Frage, ob die Eingabe, die Sie erhalten, Zeilenumbrüche enthält.

Die andere Sache, die passieren könnte, abhängig davon, wie viel Ausgang das Quellprogramm erzeugt, ist mit Pipe-Pufferung zu tun. Würde this answer helfen? Sie können auch versuchen, das Quellprogramm zu beenden (z. B. ^C oder so) und dann sehen, ob das Zielprogramm etwas ausgibt.

This Seite schlägt vor, dass Pufferung ein Problem sein könnte:

Wenn jedoch eine gepufferte Schreib verwendet wird, wird der Puffer nicht den Leser zur Verfügung gestellt, bis der Puffer geleert wird. Dieses Löschen findet statt, wenn mehr Daten in den Puffer geschrieben werden als die maximale Puffergröße (BUFSIZ in stdio.h), oder wenn die Pipe vom Writer geschlossen wird.

+0

Ich habe versucht, die Dateilänge der gelesenen Daten zu überprüfen, bevor und nachdem ich ein 'Thread.sleep (5000)' zwischen die 'BufferedReader'-Erstellung und das erste Lesen eingefügt hatte - die entsprechenden Dateilängen waren 11.498 Bytes und 15.521 Bytes mit 99 und 131 Zeilen . Daher scheint die verknüpfte Antwort nicht so zu sein. – BAR

+0

Mit '$ cat/dev/urandom | hexdump -C>/tmp/mypipe' als Schreibbefehl und Ihrem Scala-Programm als Reader läuft es unbegrenzt. Gibt es in Ihrem Quellprogramm etwas, das z. macht es etwas Benutzereingaben oder etwas ähnliches? – Vlad

+0

Keine Benutzereingabe oder Anfragen - nur ein Einweg-Tunnel. Ich werde versuchen, 'Katze' zu ​​verwenden. – BAR

Verwandte Themen