InputStream have many different classes, each of them with a unique functionality. By wrapping a stream around another, you gain the functionality of both streams.
You can wrap a stream any number of times, just take note of the ordering.
Writing characters to a file while using a buffer
File myFile = new File("targetFile.txt"); PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));
Compressing and encrypting data before writing to a file while using a buffer
Cipher cipher = ... // Initialize cipher File myFile = new File("targetFile.enc"); BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));
|BufferedOutputStream/ BufferedInputStream||While |
|DeflaterOutputStream/ DeflaterInputStream||Performs data compression.|
|InflaterOutputStream/ InflaterInputStream||Performs data decompression.|
|CipherOutputStream/ CipherInputStream||Encrypts/Decrypts data.|
|DigestOutputStream/ DigestInputStream||Generates Message Digest to verify data integrity.|
|CheckedOutputStream/ CheckedInputStream||Generates a CheckSum. CheckSum is a more trivial version of Message Digest.|
|DataOutputStream/ DataInputStream||Allows writing of primitive data types and Strings. Meant for writing bytes. Platform independent.|
|PrintStream||Allows writing of primitive data types and Strings. Meant for writing bytes. Platform dependent.|
|OutputStreamWriter||Converts a OutputStream into a Writer. An OutputStream deals with bytes while Writers deals with characters|
|PrintWriter||Automatically calls OutputStreamWriter. Allows writing of primitive data types and Strings. Strictly for writing characters and best for writing characters|