The Java TM Tutorial

| Start of Tutorial > Start of Trail > Start of Lesson | Search

Trail: Essential Java Classes
Lesson: Reading and Writing (but no 'rithmetic)

## Using the Processing Streams

> Processing streams perform some sort of operation, such as buffering or character encoding, as they read and write. Like the data sink streams, `java.io` often contains pairs of streams: one that performs a particular operation during reading and another that performs the same operation (or reverses it) during writing. This table gives `java.io`'s processing streams.

> Process | CharacterStreams | Byte Streams
> --- | --- | ---
> Buffering | `BufferedReader`, `BufferedWriter` | `BufferedInputStream`, `BufferedOutputStream`
> Filtering | `FilterReader`, `FilterWriter` | `FilterInputStream`, `FilterOutputStream`
> Converting between Bytes and Characters | `InputStreamReader`, `OutputStreamWriter` |
> Concatenation |  | `SequenceInputStream`
> Object Serialization |  | `ObjectInputStream`, `ObjectOutputStream`
> Data Conversion |  | `DataInputStream`, `DataOutputStream`
> Counting | `LineNumberReader` | `LineNumberInputStream`
> Peeking Ahead | `PushbackReader` | `PushbackInputStream`
> Printing | `PrintWriter` | `PrintStream`

> Notice that many times, `java.io` contains character streams and byte streams that perform the same processing but for the different data type. The processing streams are briefly described here:

> `BufferedReader` and `BufferedWriter` `BufferedInputStream` and `BufferedOutputStream`
>   Buffer data while reading or writing, thereby reducing the number of accesses required on the original data source. Buffered streams are typically more efficient than similar nonbuffered streams.
> `FilterReader` and `FilterWriter` `FilterInputStream` and `FilterOutputStream`
>   Abstract classes, like their parents. They define the interface for filter streams, which filter data as it's being read or written. Working with Filter Streams later in this lesson shows you how to use filter streams and how to implement your own.
> `InputStreamReader` and `OutputStreamWriter`
>   A reader and writer pair that forms the bridge between byte streams and character streams. An `InputStreamReader` reads bytes from an `InputStream` and converts them to characters using either the default character-encoding or a character-encoding specified by name. Similarly, an `OutputStreamWriter` converts characters to bytes using either the default character-encoding or a character-encoding specified by name and then writes those bytes to an `OutputStream`. You can learn the name of the default character-encoding by calling `System.getProperty("file.encoding")`. Find out more about character-encoding in the Internationalization trail.
> `SequenceInputStream`
>   Concatenates multiple input streams into one input stream. How to Concatenate Files has a short example of this class.
> `ObjectInputStream` and `ObjectOutputStream`
>   Used to serialize objects. See Object Serialization.
> `DataInputStream` and `DataOutputStream`
>   Read or write primitive Java data types in a machine-independent format. How to Use `DataInputStream` and `DataOutputStream` shows you an example of using these two streams.
> `LineNumberReader` `LineNumberInputStream`
>   Keeps track of line numbers while reading.
> `PushbackReader` `PushbackInputStream`
>   Two input streams each with a 1-character (or byte) pushback buffer. Sometimes, when reading data from a stream, you will find it useful to peek at the next item in the stream in order to decide what to do next. However, if you do peek ahead, you'll need to put the item back so that it can be read again and processed normally.
> `PrintWriter` `PrintStream`
>   Contain convenient printing methods. These are the easiest streams to write to, so you will often see other writable streams wrapped in one of these.

| Start of Tutorial > Start of Trail > Start of Lesson | Search