I was using
java.io.PipedOutputStream in an Android app. The app performed horribly bad. After doing some profiling, it turned out that the call to
PipedOutputStream.write(byte) that was really slow. After digging into the Android source code, I discovered that
PipedOutputStream.write(byte) was not implemented, it just delegated to the default implementation in
OutputStream which iterate through the array and call
PipedOutputStream.write(byte) for each byte.
PipedOutputStream.write(byte) does some synchronization and
Object.notifyAll() each time, it is really slow to do this 1000 times when you write a block of 1 KB data.
Just out of curiosity, I had a look on how
PipedOutputStream is implemented in Oracle’s standard Java implementation. I haven’t actually done any benchmarks on it, but I can see from the source code that it is a completely different implementation which does implement writing a block properly and probably efficiently.
The bottom line is: Don’t use
PipedOutputStream on Android. If you need similar functionality, implement it yourself or find a 3rd party library which does it.