xref: /aosp_15_r20/external/xz-java/src/XZSeekDecDemo.java (revision 21943e31f48dee19de75c78c0efeb8417c9a67d0)
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