Using streams for I/O is a familiar model for Java programmers. The .NET Framework embraces the same approach, with a number of subtle differences. The most important change is that a stream can be used for both reading and writing data, in contrast with Java, which separates these operations by using input and output streams (and readers and writers since Java version 1.1).
The .NET stream classes are fewer in number than the Java equivalents, partly because of the bidirectional support and partly because .NET doesn’t offer the same range of specialized streams found in the java.io package. Java version 1.1 introduced the reader and writer classes, and this has further increased the number of choices for the programmer.