Byte Streams
Programs use byte streams to perform input and output of 8-bit bytes. All byte stream classes are descended from InputStream[2] and OutputStream.[3]
Character Streams
The Java platform stores character values using Unicode conventions. Character stream I/O automatically translates this internal format to and from the local character set. In Western locales, the local character set is usually an 8-bit superset of ASCII.
All character stream classes are descended from Reader[8] and Writer.[9] As with byte streams, there are character stream classes that specialize in file I/O: FileReader[10] and FileWriter.
Character streams are often "wrappers" for byte streams. The character stream uses the byte stream to perform the physical I/O, while the character stream handles translation between characters and bytes. FileReader, for example, uses FileInputStream , while FileWriter uses FileOutputStream .
There are two general-purpose byte-to-character "bridge" streams: InputStream-Reader[13] and OutputStreamWriter.[14] Use them to create character streams when there are no prepackaged character stream classes that meet your needs. For an example that creates character streams from network byte streams, refer to the online sockets lesson.
There are four buffered stream classes used to wrap unbuffered streams: BufferedInputStream[19] and BufferedOutputStream[20] create buffered byte streams, while BufferedReader and BufferedWriter[21] create buffered character streams.
Data streams support binary I/O of primitive data type values (boolean, char, byte, short, int, long, float, and double) as well as String values. All data streams implement either the DataInput[34] or the DataOutput[35] interface. This section focuses on the most widely-used implementations of these interfaces, DataInputStream[36] and DataOutputStream.[37]
http://java.sun.com/javase/reference/index.jsp