/* * XZSeekDecDemo * * Author: Lasse Collin <lasse.collin@tukaani.org> * * This file has been put into the public domain. * You can do whatever you want with this file. */ import java.io.*; import org.tukaani.xz.*; /** * Decompresses a .xz file in random access mode to standard output. * <p> * Arguments: filename [offset1 length1] [offset2 length2] ... * <p> * If only the filename is given, the whole file is decompressed. The only * difference to XZDecDemo is that this will still use the random access code. * <p> * If one or more of the offset-length pairs are given, * for each pair, <code>length</code> number of bytes are * decompressed from <code>offset</code>. */ class XZSeekDecDemo { public static void main(String[] args) throws Exception { SeekableFileInputStream file = new SeekableFileInputStream(args[0]); SeekableXZInputStream in = new SeekableXZInputStream(file); System.err.println("Number of XZ Streams: " + in.getStreamCount()); System.err.println("Number of XZ Blocks: " + in.getBlockCount()); System.err.println("Uncompressed size: " + in.length() + " B"); System.err.println("Largest XZ Block size: " + in.getLargestBlockSize() + " B"); System.err.print("List of Check IDs:"); int checkTypes = in.getCheckTypes(); for (int i = 0; i < 16; ++i) if ((checkTypes & (1 << i)) != 0) System.err.print(" " + i); System.err.println(); System.err.println("Index memory usage: " + in.getIndexMemoryUsage() + " KiB"); byte[] buf = new byte[8192]; if (args.length == 1) { int size; while ((size = in.read(buf)) != -1) System.out.write(buf, 0, size); } else { for (int i = 1; i < args.length; i += 2) { int pos = Integer.parseInt(args[i]); int len = Integer.parseInt(args[i + 1]); in.seek(pos); while (len > 0) { int size = Math.min(len, buf.length); size = in.read(buf, 0, size); if (size == -1) { System.err.println("Error: End of file reached"); System.exit(1); } System.out.write(buf, 0, size); len -= size; } } } } }