Core Java

InputStream vs. InputStreamReader in Java

Working with data streams in Java is fundamental for interacting with files, network connections, and other sources. Among the key components in Java’s I/O framework are the InputStream and InputStreamReader classes. While both are integral to processing input data and quite similar at first glance, they serve distinct purposes and possess unique functionalities. This article explores their functionalities and highlights the key distinctions between them.

1. Understanding InputStream

The abstract class InputStream serves as a foundation for byte-oriented input streams in Java. It provides methods for reading raw bytes from various sources. InputStream can handle any type of data, including text files, images, audio, and compressed archives. It treats everything as a sequence of bytes.

Numerous subclasses like FileInputStream (reads from files), ByteArrayInputStream (reads from a byte array), and SocketInputStream (reads from network sockets) inherit from InputStream and provide specific functionalities for different data sources.

Below is a code example demonstrating how to read bytes from a file using FileInputStream:

public class InputStreamExample {

    public static void main(String[] args) {

        try (InputStream inputStream = new FileInputStream("src/main/resources/sample.txt")) {
            int data;
            while ((data = inputStream.read()) != -1) {
                // Process byte data
                System.out.print((char) data);
            }
            inputStream.close();
        } catch (IOException e) {
        }
    }
}

In this example, we create an instance of FileInputStream, a subclass of InputStream, to read bytes from a file named sample.txt. We then use the read() method to read bytes one at a time from the input stream until the end of the file is reached. Since we are dealing with raw bytes, we cast them to characters for display purposes.

2. Exploring InputStreamReader

InputStreamReader acts as a bridge between byte streams and character streams. It takes an InputStream as input and decodes the bytes into characters based on a specified character encoding (like UTF-8, UTF-16, etc.). The default encoding can be platform-dependent or set explicitly. This allows us to work with textual data without worrying about the underlying byte representation.

The constructor of InputStreamReader allows us to specify this character encoding explicitly, providing flexibility in dealing with diverse text data. Here is an example demonstrating how to use InputStreamReader to read characters from a file:

public class InputStreamReaderExample {

    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("src/main/resources/sample.txt");
        InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {
            int data;
            while ((data = reader.read()) != -1) {
                // Process character data
                System.out.print((char) data);
            }
        } catch (IOException e) {
        }
    }
}

In this example, we create an instance of InputStreamReader with the specified character encoding UTF-8 to decode bytes read from the file sample.txt into characters. The rest of the code remains similar to the previous example, with the read() method used to read characters from the input stream.

The output from running the above program is:

Fig 1: Output from running the InputStreamReader example. Note that the text file is placed in the application's src/main/resources folder.
Fig 1: Output from running the InputStreamReader example. Note that the text file is placed in the application’s src/main/resources folder.

3. InputStream vs InputStreamReader

While both InputStream and InputStreamReader are crucial components in Java’s input stream handling, they have different uses and show clear differences in how they function. Below is a tabular representation summarizing the differences between InputStream and InputStreamReader:

AspectInputStreamInputStreamReader
Input Data RepresentationDeals with raw binary data from various sourcesActs as a bridge between byte streams and character streams, decoding bytes into characters using specified character encodings
Use CasesSuitable for processing raw binary data (e.g., images, audio files)Ideal for decoding text data encoded in different character sets
Abstraction LevelOperates at a low level, handling raw bytes without interpreting character encodingFunctions at a higher level of abstraction, transforming bytes into characters based on specified character encodings
Performance ConsiderationEfficient handling of raw binary dataMay introduce some performance overhead due to character decoding, especially with large volumes of data

4. Conclusion

Understanding the distinction between InputStream and InputStreamReader is crucial for effectively handling data streams in Java. Generally, it is recommended to use InputStream when dealing with raw binary data of any type. When working with textual information, InputStreamReader provide a convenient way to read characters while considering the appropriate character encoding.

5. Download the Source Code

This was an article on InputStream vs. InputStreamReader in Java.

Download
You can download the full source code of this example here: InputStream vs. InputStreamReader in Java

Omozegie Aziegbe

Omos Aziegbe is a technical writer and web/application developer with a BSc in Computer Science and Software Engineering from the University of Bedfordshire. Specializing in Java enterprise applications with the Jakarta EE framework, Omos also works with HTML5, CSS, and JavaScript for web development. As a freelance web developer, Omos combines technical expertise with research and writing on topics such as software engineering, programming, web application development, computer science, and technology.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button