Java I/O: Input and Output Streams

One of the important set of classes comprised in Java API is the package. This is one of the core packages of the Java language and was a part of JDK 1.0. These classes facilitate the input/output functionality in our programs. Typical examples of such functionalities include:

·         Reading from the keyboard

·         Sending some output to the console

·         Storing data in a disk file

·         Chatting with another user using peer-to-peer networking

·         Transferring files

·         Browsing the Web, and so on.

 Thus, the I/O classes are used in a wide range of applications, including the latest innovations such as voice and video calls, peer-to-peer gaming, and more.

Input/Output Streams

We may not have realized this, but we have already used some functionality of I/O classes in the previous examples. In many of our programs, we used System.out.println to output a message to the user console. We learned earlier that:

·         println is a method executed on the out object.

·    The out object is of type OutputStream, which is an abstract class. It is the superclass of all classes representing an output stream of bytes.

·         A stream accepts bytes and sends them to some sink

Likewise, to read input from the user, we used the method.

·         The in is an object of type InputStream.

·         Both InputStream and OutputStream belong to the family of I/O classes.

·        The System class, which is defined in the java.lang package, contains three static fields, called in, out, and err.

·     The in is of type InputStream, whereas out and err are of the PrintStream type, which is a subclass of OutputStream.

Java defines the functionality of its various I/O classes through streams. A stream is an abstraction and can be thought of as a flow of data from a source to a sink. A stream can be classified in two ways.

·         A source stream, also called an input stream, initiates the flow of data.

·         A sink stream, also called an output stream, terminates the flow of data.

Source and sink streams are also called node streams. A stream is just a continuous flow of data. Like an array that holds some data, a stream does not have the concept of a data index. We cannot move back and forth in a stream. The data can only be accessed sequentially.

A stream either consumes or provides information. A stream is usually linked to a physical device. It provides a uniform interface to a device for data flow. In the case of an input stream, the device to which it connects may be a physical disk, a network connection, a keyboard, and so on.

In the case of an output stream, it may be connected to a console, a physical disk, a network connection, and so on. Thus, when we use the input/output stream classes, our program code becomes independent of the device to which the stream connects. Examples of source streams are files and memory buffers. A printer or a console can represent a stream destination.

The streams in Java are of two types:

·         Byte oriented

·         Character oriented

The byte streams operate on bytes of data, whereas the character-oriented streams operate on characters, typically a Unicode character set. JDK 1.0 provided only byte-oriented streams. JDK 1.1 introduced character-oriented streams. Because the underlying mechanism for streams is still byte oriented, JDK 1.1 also introduced bridge classes to convert a byte stream into a character stream, and vice versa.

Leave Comment