1*21943e31SAndroid Build Coastguard Worker /* 2*21943e31SAndroid Build Coastguard Worker * XZSeekEncDemo 3*21943e31SAndroid Build Coastguard Worker * 4*21943e31SAndroid Build Coastguard Worker * Author: Lasse Collin <[email protected]> 5*21943e31SAndroid Build Coastguard Worker * 6*21943e31SAndroid Build Coastguard Worker * This file has been put into the public domain. 7*21943e31SAndroid Build Coastguard Worker * You can do whatever you want with this file. 8*21943e31SAndroid Build Coastguard Worker */ 9*21943e31SAndroid Build Coastguard Worker 10*21943e31SAndroid Build Coastguard Worker import java.io.*; 11*21943e31SAndroid Build Coastguard Worker import org.tukaani.xz.*; 12*21943e31SAndroid Build Coastguard Worker 13*21943e31SAndroid Build Coastguard Worker /** 14*21943e31SAndroid Build Coastguard Worker * Compresses a single file from standard input to standard ouput into 15*21943e31SAndroid Build Coastguard Worker * a random-accessible .xz file. 16*21943e31SAndroid Build Coastguard Worker * <p> 17*21943e31SAndroid Build Coastguard Worker * Arguments: [preset [block size]] 18*21943e31SAndroid Build Coastguard Worker * <p> 19*21943e31SAndroid Build Coastguard Worker * Preset is an LZMA2 preset level which is an integer in the range [0, 9]. 20*21943e31SAndroid Build Coastguard Worker * The default is 6. 21*21943e31SAndroid Build Coastguard Worker * <p> 22*21943e31SAndroid Build Coastguard Worker * Block size specifies the amount of uncompressed data to store per 23*21943e31SAndroid Build Coastguard Worker * XZ Block. The default is 1 MiB (1048576 bytes). Bigger means better 24*21943e31SAndroid Build Coastguard Worker * compression ratio. Smaller means faster random access. 25*21943e31SAndroid Build Coastguard Worker */ 26*21943e31SAndroid Build Coastguard Worker class XZSeekEncDemo { main(String[] args)27*21943e31SAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 28*21943e31SAndroid Build Coastguard Worker LZMA2Options options = new LZMA2Options(); 29*21943e31SAndroid Build Coastguard Worker 30*21943e31SAndroid Build Coastguard Worker if (args.length >= 1) 31*21943e31SAndroid Build Coastguard Worker options.setPreset(Integer.parseInt(args[0])); 32*21943e31SAndroid Build Coastguard Worker 33*21943e31SAndroid Build Coastguard Worker int blockSize = 1024 * 1024; 34*21943e31SAndroid Build Coastguard Worker if (args.length >= 2) 35*21943e31SAndroid Build Coastguard Worker blockSize = Integer.parseInt(args[1]); 36*21943e31SAndroid Build Coastguard Worker 37*21943e31SAndroid Build Coastguard Worker options.setDictSize(Math.min(options.getDictSize(), 38*21943e31SAndroid Build Coastguard Worker Math.max(LZMA2Options.DICT_SIZE_MIN, 39*21943e31SAndroid Build Coastguard Worker blockSize))); 40*21943e31SAndroid Build Coastguard Worker 41*21943e31SAndroid Build Coastguard Worker System.err.println("Encoder memory usage: " 42*21943e31SAndroid Build Coastguard Worker + options.getEncoderMemoryUsage() + " KiB"); 43*21943e31SAndroid Build Coastguard Worker System.err.println("Decoder memory usage: " 44*21943e31SAndroid Build Coastguard Worker + options.getDecoderMemoryUsage() + " KiB"); 45*21943e31SAndroid Build Coastguard Worker System.err.println("Block size: " + blockSize + " B"); 46*21943e31SAndroid Build Coastguard Worker 47*21943e31SAndroid Build Coastguard Worker XZOutputStream out = new XZOutputStream(System.out, options); 48*21943e31SAndroid Build Coastguard Worker 49*21943e31SAndroid Build Coastguard Worker byte[] buf = new byte[8192]; 50*21943e31SAndroid Build Coastguard Worker int left = blockSize; 51*21943e31SAndroid Build Coastguard Worker 52*21943e31SAndroid Build Coastguard Worker while (true) { 53*21943e31SAndroid Build Coastguard Worker int size = System.in.read(buf, 0, Math.min(buf.length, left)); 54*21943e31SAndroid Build Coastguard Worker if (size == -1) 55*21943e31SAndroid Build Coastguard Worker break; 56*21943e31SAndroid Build Coastguard Worker 57*21943e31SAndroid Build Coastguard Worker out.write(buf, 0, size); 58*21943e31SAndroid Build Coastguard Worker left -= size; 59*21943e31SAndroid Build Coastguard Worker 60*21943e31SAndroid Build Coastguard Worker if (left == 0) { 61*21943e31SAndroid Build Coastguard Worker out.endBlock(); 62*21943e31SAndroid Build Coastguard Worker left = blockSize; 63*21943e31SAndroid Build Coastguard Worker } 64*21943e31SAndroid Build Coastguard Worker } 65*21943e31SAndroid Build Coastguard Worker 66*21943e31SAndroid Build Coastguard Worker out.finish(); 67*21943e31SAndroid Build Coastguard Worker } 68*21943e31SAndroid Build Coastguard Worker } 69