Input and output

The
Java library classes for IO are divided by input
and output,
as you can see by looking at the online Java class hierarchy with your Web
browser. By inheritance, all classes derived from InputStream
have basic methods called read( )
for
reading a single byte or array of bytes. Likewise, all classes derived from OutputStream
have
basic methods called write( )
for
writing a single byte or array of bytes. However, you won’t generally use
these methods; they exist so more sophisticated classes can use them as they
provide a more useful interface. Thus, you’ll rarely create your stream
object by using a single class, but instead will layer multiple objects
together to provide your desired functionality. The fact that you create more
than one object to create a single resulting stream is the primary reason that
Java’s stream library is confusing.

It’s
helpful to categorize the classes by their functionality. The library designers
started by deciding that all classes that had anything to do with input would
be inherited from
InputStream
and all classes that were associated with output would be inherited from
OutputStream.

Types
of InputStream

InputStream’s
job is to represent classes that produce input from different sources. These
sources can be (and each has an associated subclass of
InputStream):

An
array of bytes

A
String
object

A
file

A
“pipe,” which works like a physical pipe:
you put things in one end and they come out the other

A
sequence of other streams, so you can collect them together into a single stream

Other
sources, such as an Internet connection. (This will be discussed in a later
chapter.)

In
addition, the
FilterInputStream
is also a type of
InputStream,
to provide a base class for "decorator" classes that attach attributes or
useful interfaces to input streams. This is discussed later.

Table
10-1. Types of InputStream

Class

Function

Constructor
Arguments

How
to use it

ByteArray-InputStream

Allows
a buffer in memory to be used as an
InputStream.

The
buffer from which to extract the bytes.

As
a source of data. Connect it to a
FilterInputStream
object to provide a useful interface.

StringBuffer-InputStream

Converts
a
String
into an
InputStream.

A
String.
The underlying implementation actually uses a StringBuffer.

As
a source of data. Connect it to a
FilterInputStream
object to provide a useful interface.

File-InputStream

For
reading information from a file.

A
String
representing the file name, or a File
or FileDescriptor
object.

As
a source of data. Connect it to a
FilterInputStream
object to provide a useful interface.

Piped-InputStream

Produces
the data that’s being written to the associated PipedOutput-Stream.
Implements the “piping” concept.

PipedOutputStream

As
a source of data in multithreading. Connect it to a
FilterInputStream
object to provide a useful interface.

Sequence-InputStream

Coverts
two or more
InputStream
objects into a single
InputStream.

Two
InputStream
objects or an
Enumeration
for a container of
InputStream
objects.

As
a source of data. Connect it to a
FilterInputStream
object to provide a useful interface.

Filter-InputStream

Abstract
class which is an interface for decorators that provide useful functionality to
the other
InputStream
classes. See Table 10-3.

See
Table 10-3.

See
Table 10-3.

Types
of OutputStream

This
category includes the classes that decide where your output will go: an array
of bytes (no
String,
however; presumably you can create one using the array of bytes), a file, or a
“pipe.”

In
addition, the
FilterOutputStream
provides a base class for "decorator" classes that attach attributes or useful
interfaces to output streams. This is discussed later.

Table
10-2. Types of OutputStream

Class

Function

Constructor
Arguments

How
to use it

ByteArray-OutputStream

Creates
a buffer in memory. All the data that you send to the stream is placed in this
buffer.

Optional
initial size of the buffer.

To
designate the destination of your data. Connect it to a
FilterOutputStream
object to provide a useful interface.

File-OutputStream

For
sending information to a file.

A
String
representing the file name, or a
File
or
FileDescriptor
object.

To
designate the destination of your data. Connect it to a
FilterOutputStream
object to provide a useful interface.

Piped-OutputStream

Any
information you write to this automatically ends up as input for the associated
PipedInput-Stream.
Implements the “piping” concept.

PipedInputStream

To
designate the destination of your data for multithreading. Connect it to a
FilterOutputStream
object to provide a useful interface.

Filter-OutputStream

Abstract
class which is an interface for decorators that provide useful functionality to
the other
OutputStream
classes. See Table

Top White Papers and Webcasts

When individual departments procure cloud service for their own use, they usually don't consider the hazardous organization-wide implications. Read this paper to learn best practices for setting up an internal, IT-based cloud brokerage function that service the entire organization. Find out how this approach enables you to retain top-down visibility and control of network security and manage the impact of cloud traffic on your WAN.

U.S. companies are desperately trying to recruit and hire skilled software engineers and developers, but there is simply not enough quality talent to go around. Tiempo Development is a nearshore software development company. Our headquarters are in AZ, but we are a pioneer and leader in outsourcing to Mexico, based on our three software development centers there. We have a proven process and we are experts at providing our customers with powerful solutions. We transform ideas into reality.