blob: 5c54a870c2839f7d9d81316b901174f4f4d32b62 [file] [log] [blame]
/*
* 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;
}
}
}
}
}