The library should throw the IOException all the way up so that the application can do something with it (rather than allow the underlying library to dump the exception to the log repeatedly)

I don’t know why you would want to hide the exception after all? What if the connection that caused the exception had to be reset. Fundamentally, confused is the function of the library and the fact that managing connections is the responsibility of the application. Thats what happens when your stream is embedded so deep into a stack trace of several method calls in a library. Bah humbug.