The library writer is the "consumer" here. The programmer just uses the library, and the library chooses the proper stream representation.
Of course the programmer can also use the lower-level stream interface directly if desired, but then the programmer must also know which stream representation to choose.
Of course the programmer can also use the lower-level stream interface directly if desired, but then the programmer must also know which stream representation to choose.