Java InputStream To DataHandler Example
When working with file uploads, email attachments, or binary data processing in Java applications, developers frequently deal with InputStream objects. At the same time, APIs such as JavaMail or web services often require data in the form of a DataHandler. A common issue developers encounter is a compilation error when attempting to directly convert an InputStream into a DataHandler. The problem occurs because DataHandler does not accept InputStream objects directly. Instead, it works with objects implementing the DataSource interface. Therefore, developers must wrap the InputStream in a suitable DataSource implementation before creating the DataHandler. Let us delve into understanding how Java InputStream to DataHandler conversion works and how it can be used to handle and process stream-based data efficiently.
1. Why InputStream Cannot Be Passed Directly to DataHandler
Consider the following incorrect approach that often leads to a compilation error:
InputStream inputStream = resultSet.getBinaryStream("file_data");
DataHandler handler = new DataHandler(inputStream); // Compilation Error
The error occurs because the DataHandler constructor does not accept an InputStream. It expects one of the following:
- An object implementing the
DataSourceinterface - A Java object with a specified MIME type
- A URL reference
Since InputStream does not implement DataSource, the compiler cannot resolve the constructor call. The correct approach is to wrap the stream inside a DataSource implementation.
2. Retrieving Binary Data Using getBinaryStream()
When working with database BLOB data, developers typically retrieve binary content using the getBinaryStream() method of the ResultSet class.
InputStream inputStream = resultSet.getBinaryStream("file_data");
This method returns an InputStream that allows applications to read binary data stored in a database column. However, if the application needs to send this binary data as an attachment (for example, in email services or SOAP messages), it must be converted into a DataHandler. To achieve this, we wrap the stream using a DataSource.
3. How DataHandler Works with DataSource
The DataHandler class from the javax.activation package acts as a wrapper around data sources and provides a consistent interface for handling binary or typed data. It is widely used in:
- JavaMail attachments
- SOAP web services
- File data transmission
- Binary content handling
To convert an InputStream into a DataHandler, we can create a custom DataSource implementation that reads from the stream.
4. Converting InputStream to DataHandler in Java
The following example demonstrates how to wrap an InputStream inside a DataSource and create a DataHandler in Java.
// InputStreamToDataHandlerExample.java
import javax.activation.DataHandler;
import javax.activation.DataSource;
import java.io.*;
public class InputStreamToDataHandlerExample {
public static void main(String[] args) {
try {
// Simulate InputStream (for example, database BLOB or file)
InputStream inputStream = new ByteArrayInputStream(
"Sample file content for DataHandler demonstration".getBytes()
);
// Wrap InputStream inside DataSource
DataSource dataSource = new InputStreamDataSource(inputStream, "text/plain");
// Create DataHandler
DataHandler dataHandler = new DataHandler(dataSource);
// Read data back from DataHandler
InputStream streamFromHandler = dataHandler.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(streamFromHandler));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/* Custom DataSource Implementation */
class InputStreamDataSource implements DataSource {
private InputStream inputStream;
private String contentType;
public InputStreamDataSource(InputStream inputStream, String contentType) {
this.inputStream = inputStream;
this.contentType = contentType;
}
@Override
public InputStream getInputStream() throws IOException {
return inputStream;
}
@Override
public OutputStream getOutputStream() throws IOException {
throw new IOException("OutputStream not supported");
}
@Override
public String getContentType() {
return contentType;
}
@Override
public String getName() {
return "InputStreamDataSource";
}
}
4.1 Code Explanation
This Java example demonstrates how to convert an InputStream into a DataHandler using the Java Activation Framework. The program first simulates an InputStream using a ByteArrayInputStream containing sample text, which represents data that could come from sources like a file or a database BLOB. Since DataHandler requires a DataSource, a custom class called InputStreamDataSource is implemented that wraps the InputStream and defines its content type. The DataHandler is then created using this DataSource, allowing the wrapped data to be handled in a standardized way. The program retrieves the InputStream back from the DataHandler, reads it using a BufferedReader, and prints the content line by line. The custom InputStreamDataSource class implements the DataSource interface by providing methods to return the input stream, define the content type, and provide a name, while the output stream operation is intentionally unsupported. This approach is commonly used when working with email attachments, SOAP messages, or other APIs that require data to be provided through a DataHandler.
4.2 Program Output
The following output is produced when the program is executed:
Sample file content for DataHandler demonstration
The output confirms that the binary data wrapped inside the DataHandler can be successfully read and processed.
5. Conclusion
The compilation error encountered when converting an InputStream to a DataHandler arises because the DataHandler class does not directly accept stream objects. Instead, it expects data wrapped inside a DataSource implementation. By retrieving binary data using getBinaryStream() and wrapping the resulting InputStream inside a custom DataSource, developers can easily construct a valid DataHandler. This approach is commonly used when sending email attachments, processing web service payloads, or handling binary content within enterprise Java applications. Understanding the relationship between InputStream, DataSource, and DataHandler ensures that developers can avoid compilation issues and build robust data-processing solutions.
5.1 Best Practices When Using InputStream with DataHandler
When working with InputStream and DataHandler, developers should follow a few best practices:
- Always close InputStream objects to avoid resource leaks.
- Use buffered streams when processing large binary files.
- Specify the correct MIME type when creating a DataSource.
- Reuse existing DataSource implementations whenever possible.
- Handle exceptions properly when dealing with I/O operations.
Following these practices ensures better performance, reliability, and maintainability in enterprise Java applications.


