pentaho/pentaho-kettle · error · KettleException
Compression provider
Error message
Compression provider {compressionType} does not support output streams! What it means
After locating a compression provider by name, TextFileOutput checks supportsOutput(). Some providers (e.g. decompression-only ones like certain input-oriented providers) cannot produce output streams; using one for a text file output target throws this KettleException. The provider exists but is not suitable for writing.
Solutions
- Choose a compression provider that supports output (e.g. 'None', 'Zip', 'GZip') in the Text File Output step
- Swap the provider for one whose supportsOutput() returns true (check with the plugin vendor)
- If writing is genuinely unsupported, write uncompressed and compress in a post-processing job step
Example fix
// before meta.setFileCompression( "SomeReadonlyProvider" ); // supportsOutput() == false // after meta.setFileCompression( "GZip" ); // supports writing output streams
Defensive patterns
Strategy: validation
Validate before calling
CompressionProvider p = CompressionProviderFactory.getInstance()
.getCompressionProviderByName( Const.NVL( meta.getFileCompression(), "None" ) );
if ( p != null && !p.supportsOutput() ) {
throw new IllegalArgumentException( "Provider " + p.getName() + " cannot write output streams" );
} Try / catch
try {
getCompressionProvider();
} catch ( KettleException e ) {
if ( e.getMessage().contains( "does not support output streams" ) ) {
logError( "Falling back to uncompressed output", e );
meta.setFileCompression( "None" );
}
} Prevention
- Use only output-capable providers (None, Zip, GZip) in output steps
- Do not copy compression settings from input steps to output steps
- Verify supportsOutput() when adopting third-party compression plugins
When it happens
Trigger: getCompressionProvider -> compressionProvider where the resolved CompressionProvider returns false from supportsOutput(): i.e. the step is configured to write a compressed file using a provider that only supports reading/input streams.
Common situations: Selecting a decompression-only provider in the Text File Output dialog; copying a compression setting from a Text File Input step into an Output step; custom/3rd-party compression plugin implementing only input streams.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- No compression provider found with name =
- AccessInput.Exception.CouldnotFindField
- AccessInput.Log.NoField
- AddSequence.Exception.NoSpecifiedMethod
- At this time we don't support the use of multiple cluster…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/d73eff4a7842385d.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/textfileoutput/TextFileOutput.java:106
public boolean isFileExists( String filename ) throws KettleException {
try {
return getFileObject( filename, getTransMeta() ).exists();
} catch ( Exception e ) {
throw new KettleException( "Error opening new file : " + e.toString() );
}
}
private CompressionProvider getCompressionProvider() throws KettleException {
String compressionType = Const.NVL( meta.getFileCompression(), FILE_COMPRESSION_TYPE_NONE );
CompressionProvider compressionProvider = CompressionProviderFactory.getInstance().getCompressionProviderByName( compressionType );
if ( compressionProvider == null ) {
throw new KettleException( "No compression provider found with name = " + compressionType );
}
if ( !compressionProvider.supportsOutput() ) {
throw new KettleException( "Compression provider " + compressionType + " does not support output streams!" );
}
return compressionProvider;
}
private void initServletStreamWriter( ) throws KettleException {
data.writer = null;
try {
Writer writer = getTrans().getServletPrintWriter();
if ( Utils.isEmpty( meta.getEncoding( ) ) ) {
data.writer = new WriterOutputStream( writer );
} else {
data.writer = new WriterOutputStream( writer, meta.getEncoding( ) );
}
} catch ( Exception e ) {
throw new KettleException( "Error opening new file : " + e.toString() );
}
}
View on GitHub (pinned to f3058517a1)