How to convert InputStream to byte array in Java ?

To convert an InputStream to a byte[] (byte array) in Java, you need to read all bytes from the stream and store them in a byte array. Below are multiple methods to achieve this, along with detailed explanations and examples.

1. Using ByteArrayOutputStream (Traditional Approach)

This method reads chunks of data from the InputStream into a buffer and writes them to a ByteArrayOutputStream, which is then converted to a byte array.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArray {
    public static byte[] convertToByteArray(InputStream inputStream) throws IOException {
        try (InputStream is = inputStream) {
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            byte[] data = new byte[1024]; // Buffer size (adjust as needed)
            int bytesRead;
            while ((bytesRead = is.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, bytesRead);
            }
            buffer.flush();
            return buffer.toByteArray();
        }
    }
}

Explanation:

  • ByteArrayOutputStream collects bytes read from the InputStream.
  • A buffer (e.g., 1024 bytes) is used to read data in chunks for efficiency.
  • try-with-resources ensures the InputStream is closed automatically.
  • flush() ensures all bytes are written to the output stream.

2. Using InputStream.readAllBytes() (Java 9+)

Java 9 introduced the InputStream.readAllBytes() method, which directly reads all bytes from the stream into a byte array.

import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArray {
    public static byte[] convertToByteArrayJava9(InputStream inputStream) throws IOException {
        try (InputStream is = inputStream) {
            return is.readAllBytes();
        }
    }
}

Pros:

  • Simplifies code to a single line.
  • No need for manual buffer management.

Cons:

  • Requires Java 9 or later.

3. Using Apache Commons IO (Third-Party Library)

If you use Apache Commons IO, leverage IOUtils.toByteArray() for a concise solution.

import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArray {
    public static byte[] convertWithApacheCommons(InputStream inputStream) throws IOException {
        return IOUtils.toByteArray(inputStream);
    }
}

Dependency (Maven):

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.13.0</version>
</dependency>

Pros:

  • Extremely concise.
  • Handles edge cases internally.

4. Using InputStream.read() with Loop

A manual approach using InputStream.read() to read bytes one by one (less efficient but explicit).

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArray {
    public static byte[] convertManually(InputStream inputStream) throws IOException {
        try (InputStream is = inputStream) {
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            int b;
            while ((b = is.read()) != -1) {
                buffer.write(b);
            }
            return buffer.toByteArray();
        }
    }
}

Cons:

  • Inefficient for large streams (reads one byte at a time).

Key Notes

  1. Exception Handling: All methods throw IOException; handle it appropriately.
  2. Stream Closure: Use try-with-resources to ensure the InputStream is closed.
  3. Performance: For large streams, use a buffer (e.g., 4KB–8KB) to reduce I/O operations.
  4. Memory: Avoid converting very large streams to byte arrays (risk of OutOfMemoryError).

Example Usage

import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) {
        String sampleText = "Hello, World!";
        InputStream inputStream = new ByteArrayInputStream(sampleText.getBytes());

        try {
            byte[] byteArray = InputStreamToByteArray.convertToByteArray(inputStream);
            System.out.println(new String(byteArray)); // Output: "Hello, World!"
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Method Comparison

MethodProsCons
ByteArrayOutputStreamCompatible with all Java versionsMore verbose
InputStream.readAllBytes()Simplest (Java 9+)Not available in Java 8 or earlier
Apache Commons IOConcise, robustRequires third-party library
Manual read() loopExplicit controlVery inefficient for large streams

Best Practices

  • Use InputStream.readAllBytes() if Java 9+ is available.
  • For Java 8 or earlier, use ByteArrayOutputStream with a buffer.
  • Prefer Apache Commons IO if already using it in your project.
  • Always close the InputStream after processing (e.g., via try-with-resources).

By choosing the appropriate method, you can efficiently convert an InputStream to a byte array in Java.

Leave a Reply

Your email address will not be published. Required fields are marked *