1*21943e31SAndroid Build Coastguard Worker /* 2*21943e31SAndroid Build Coastguard Worker * XZSeekDecDemo 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 * Decompresses a .xz file in random access mode to standard output. 15*21943e31SAndroid Build Coastguard Worker * <p> 16*21943e31SAndroid Build Coastguard Worker * Arguments: filename [offset1 length1] [offset2 length2] ... 17*21943e31SAndroid Build Coastguard Worker * <p> 18*21943e31SAndroid Build Coastguard Worker * If only the filename is given, the whole file is decompressed. The only 19*21943e31SAndroid Build Coastguard Worker * difference to XZDecDemo is that this will still use the random access code. 20*21943e31SAndroid Build Coastguard Worker * <p> 21*21943e31SAndroid Build Coastguard Worker * If one or more of the offset-length pairs are given, 22*21943e31SAndroid Build Coastguard Worker * for each pair, <code>length</code> number of bytes are 23*21943e31SAndroid Build Coastguard Worker * decompressed from <code>offset</code>. 24*21943e31SAndroid Build Coastguard Worker */ 25*21943e31SAndroid Build Coastguard Worker class XZSeekDecDemo { main(String[] args)26*21943e31SAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 27*21943e31SAndroid Build Coastguard Worker SeekableFileInputStream file = new SeekableFileInputStream(args[0]); 28*21943e31SAndroid Build Coastguard Worker SeekableXZInputStream in = new SeekableXZInputStream(file); 29*21943e31SAndroid Build Coastguard Worker 30*21943e31SAndroid Build Coastguard Worker System.err.println("Number of XZ Streams: " + in.getStreamCount()); 31*21943e31SAndroid Build Coastguard Worker System.err.println("Number of XZ Blocks: " + in.getBlockCount()); 32*21943e31SAndroid Build Coastguard Worker 33*21943e31SAndroid Build Coastguard Worker System.err.println("Uncompressed size: " + in.length() + " B"); 34*21943e31SAndroid Build Coastguard Worker 35*21943e31SAndroid Build Coastguard Worker System.err.println("Largest XZ Block size: " 36*21943e31SAndroid Build Coastguard Worker + in.getLargestBlockSize() + " B"); 37*21943e31SAndroid Build Coastguard Worker 38*21943e31SAndroid Build Coastguard Worker System.err.print("List of Check IDs:"); 39*21943e31SAndroid Build Coastguard Worker int checkTypes = in.getCheckTypes(); 40*21943e31SAndroid Build Coastguard Worker for (int i = 0; i < 16; ++i) 41*21943e31SAndroid Build Coastguard Worker if ((checkTypes & (1 << i)) != 0) 42*21943e31SAndroid Build Coastguard Worker System.err.print(" " + i); 43*21943e31SAndroid Build Coastguard Worker System.err.println(); 44*21943e31SAndroid Build Coastguard Worker 45*21943e31SAndroid Build Coastguard Worker System.err.println("Index memory usage: " 46*21943e31SAndroid Build Coastguard Worker + in.getIndexMemoryUsage() + " KiB"); 47*21943e31SAndroid Build Coastguard Worker 48*21943e31SAndroid Build Coastguard Worker byte[] buf = new byte[8192]; 49*21943e31SAndroid Build Coastguard Worker if (args.length == 1) { 50*21943e31SAndroid Build Coastguard Worker int size; 51*21943e31SAndroid Build Coastguard Worker while ((size = in.read(buf)) != -1) 52*21943e31SAndroid Build Coastguard Worker System.out.write(buf, 0, size); 53*21943e31SAndroid Build Coastguard Worker } else { 54*21943e31SAndroid Build Coastguard Worker for (int i = 1; i < args.length; i += 2) { 55*21943e31SAndroid Build Coastguard Worker int pos = Integer.parseInt(args[i]); 56*21943e31SAndroid Build Coastguard Worker int len = Integer.parseInt(args[i + 1]); 57*21943e31SAndroid Build Coastguard Worker 58*21943e31SAndroid Build Coastguard Worker in.seek(pos); 59*21943e31SAndroid Build Coastguard Worker 60*21943e31SAndroid Build Coastguard Worker while (len > 0) { 61*21943e31SAndroid Build Coastguard Worker int size = Math.min(len, buf.length); 62*21943e31SAndroid Build Coastguard Worker size = in.read(buf, 0, size); 63*21943e31SAndroid Build Coastguard Worker 64*21943e31SAndroid Build Coastguard Worker if (size == -1) { 65*21943e31SAndroid Build Coastguard Worker System.err.println("Error: End of file reached"); 66*21943e31SAndroid Build Coastguard Worker System.exit(1); 67*21943e31SAndroid Build Coastguard Worker } 68*21943e31SAndroid Build Coastguard Worker 69*21943e31SAndroid Build Coastguard Worker System.out.write(buf, 0, size); 70*21943e31SAndroid Build Coastguard Worker len -= size; 71*21943e31SAndroid Build Coastguard Worker } 72*21943e31SAndroid Build Coastguard Worker } 73*21943e31SAndroid Build Coastguard Worker } 74*21943e31SAndroid Build Coastguard Worker } 75*21943e31SAndroid Build Coastguard Worker } 76