// LzmaInputStream.java -- transparently decompress LZMA while reading
// Copyright (c)2007 Christopher League <league@contrapunctus.net>
// This is free software, but it comes with ABSOLUTELY NO WARRANTY.
// GNU Lesser General Public License 2.1 or Common Public License 1.0
package net.contrapunctus.lzma;
import SevenZip.Compression.LZMA.Encoder;
import SevenZip.Compression.LZMA.Decoder;
import java.io.*;
public class LzmaInputStream extends FilterInputStream
{
protected DecoderThread dth;
private static final PrintStream dbg = System.err;
private static final boolean DEBUG =
System.getProperty("DEBUG_LzmaStreams") != null;
public LzmaInputStream( InputStream _in )
{
super( null );
dth = new DecoderThread( _in );
in = new ConcurrentBufferInputStream( dth.q );
if(DEBUG) dbg.printf("%s << %s (%s)%n", this, in, dth.q);
dth.start( );
}
public void close( ) throws IOException
{
if(DEBUG) dbg.printf("%s closed%n", this);
super.close( );
}
public String toString( )
{
return String.format("lzmaIn@%x", hashCode());
}
public static void main( String[] args ) throws IOException
{
// first compress
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream( baos );
ps.print("I will try decoding this text.");
ps.close();
byte[] buf = baos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream( buf );
baos = new ByteArrayOutputStream();
Encoder enc = new Encoder();
enc.SetEndMarkerMode(true);
enc.WriteCoderProperties( baos );
enc.Code( bis, baos, -1, -1, null );
buf = baos.toByteArray();
// then decompress traditionally
bis = new ByteArrayInputStream( buf );
Decoder dec = new Decoder();
byte[] props = new byte[5];
bis.read( props, 0, 5 );
dec.SetDecoderProperties( props );
dec.Code( bis, System.out, -1 );
System.out.println();
// and using stream
bis = new ByteArrayInputStream( buf );
LzmaInputStream is = new LzmaInputStream( bis );
//for( int k = is.read(); k != -1; k = is.read() )
// {
// System.out.printf("%02x %c%n", k, (char)k);
// }
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine());
}
}