net.pincette.rs.encoders.Deflate Maven / Gradle / Ivy
package net.pincette.rs.encoders;
import static java.nio.ByteBuffer.allocate;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Deflater;
import net.pincette.rs.Encoder;
/**
* An encoder that deflates a ByteBuffer stream.
*
* @author Werner Donn\u00e9
* @since 3.0
*/
public class Deflate implements Encoder {
private final Deflater deflater;
private int lastCapacity;
public Deflate() {
this(new Deflater());
}
public Deflate(final Deflater deflater) {
this.deflater = deflater;
}
public static Encoder deflate() {
return new Deflate();
}
public static Encoder deflate(final Deflater deflater) {
return new Deflate(deflater);
}
private void deflate(final List result, final int capacity) {
final ByteBuffer b = allocate(capacity);
final int compressed = deflater.deflate(b);
if (compressed > 0) {
result.add(b.position(0).limit(compressed));
}
}
public List complete() {
final List result = new ArrayList<>();
if (!deflater.finished()) {
deflater.finish();
while (!deflater.finished()) {
deflate(result, lastCapacity);
}
}
deflater.end();
return result;
}
public List encode(final ByteBuffer buffer) {
final List result = new ArrayList<>();
if (!deflater.finished()) {
deflater.setInput(buffer);
lastCapacity = buffer.capacity();
while (!deflater.needsInput()) {
deflate(result, lastCapacity);
}
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy