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