My goal is to create (or use existing) an InputStream implementation (say, MergeInputStream) that will try to read from a multiple InputStreams and return the first result. After that it will release lock and stop reading from all InputStreams until next mergeInputStream.read() call. I was quite surprised that I didn't found any such tool. The thing is: all of the source InputStreams are not quite finite (not a file, for example, but a System.in, socket or such), so I cannot use SequenceInputReader. I understand that this will probably require some multi-thread mechanism, but I have absolutely no idea how to do it. I tried to google it but with no result.
I can think of three ways to do this:
- Use non-blocking I/O (API documentation). This is the cleanest solution.
- Multiple threads, one for each merged input stream. The threads would block on the
read()method of the associated input stream, then notify the
MergeInputStreamobject when data becomes available. The
MergedInputStreamwould wait for this notification, then read data from the corresponding stream.
- Single thread with a busy loop. Your
MergeInputStream.read()methods would need to loop checking the
available()method of every merged input stream. If no data is available, sleep a few ms. Repeat until data becomes available in one of the merged input streams.