Mam dwa wątki. Jeden z nich zapisuje do PipedOutputStream, inny odczytuje z odpowiedniego PipedInputStream. Tło polega na tym, że jeden wątek pobiera pewne dane ze zdalnego serwera i multipleksuje go do kilku innych wątków za pośrednictwem potokowanych strumieni.PipedInputStream - Jak uniknąć "java.io.IOException: Pipe broken"
Problem polega na tym, że czasami (szczególnie podczas pobierania dużego (> 50MB) pliki) otrzymuję java.io.IOException pipe uszkodzony podczas próby odczytu z PipedInputStream.
Javadoc mówi, że A pipe is said to be broken if a thread that was providing data bytes to the connected piped output stream is no longer alive.
To prawda, mój wątek w piśmie naprawdę umiera po zapisaniu wszystkich swoich danych do PipedOutputStream.
Jakieś rozwiązania? Jak mogę zapobiec wysyłaniu przez PipedInputStream tego wyjątku? Chcę móc odczytać wszystkie dane, które zostały napisane do PipedOutputStream, nawet jeśli pisanie wątku zakończyło jego pracę. (Jeśli ktoś wie, jak pisać wątek przy życiu, dopóki wszystkie dane nie zostaną odczytane, to rozwiązanie jest również dopuszczalne).
Niezła funkcja, zdecydowanie +1, ale musi współdzielić jedną instancję CountDownLatch między różnymi wątkami. Nie jest to zbyt dobre, ponieważ pisanie i czytanie wątków jest tworzone w różnych miejscach i chcę, żeby nie wiedzieli o sobie nawzajem. Moja architektura jest teraz taka, że wiedzą tylko, że powinna pisać/czytać do/z danego strumienia. – levanovd
W takim razie można rozszerzyć Piped [In | Out] putStream, aby obsłużyć manipulację CountDownLatch. – Jerome
lub wpisz własny Input/OutputStream, który otacza rurę i zatrzask (zobacz przykładowy kod dodany w mojej odpowiedzi) – Jerome