IO stream in Java

A low-level IO stream connects directly with the source of the data, such as a file, an array, or a String. Low-level streams process the raw data or resource and are accessed in a direct and unfiltered manner. Alternatively, a high-level IO stream is built on top of another stream using wrapping. Wrapping is the process by which an instance is passed to the constructor of another class and operations on the resulting instance are filtered and applied to the original instance. High-level streams can take other high-level streams as input. 


Class Name | Low/High Level | Description
----- | ----- | -----
InputStream | N/A | The abstract class all InputStream classes inherit from
OutputStream | N/A | The abstract class all OutputStream classes inherit from
Reader | N/A | The abstract class all Reader classes inherit from
Writer | N/A | The abstract class all Writer classes inherit from
FileInputStream | Low | Reads file data as bytes
FileOutputStream | Low | Writes file data as bytes
FileReader | Low | Reads file data as characters
FileWriter | Low | Writes file data as characters
BufferedReader | High | Reads character data from an existing Reader in a buffered manner, which improves efficiency and performance
BufferedWriter | High | Writes character data to an existing Writer in a buffered manner, which improves efficiency and performance. A BufferedWriter must wrap another Writer and cannot use directly.
ObjectInputStream | High | Deserializes primitive Java data types and graphs of Java objects from an existing InputStream
ObjectOutputStream | High | Serializes primitive Java data types and graphs of Java objects to an existing OutputStream
InputStreamReader | High | Reads character data from an existing InputStream
OutputStreamWriter | High | Writes character data to an existing OutputStream
PrintStream | High | Writes formatted representations of Java objects to a binary stream
PrintWriter | High | Writes formatted representations of Java objects to a text-based output stream