xref: /aosp_15_r20/external/xz-java/src/XZSeekEncDemo.java (revision 21943e31f48dee19de75c78c0efeb8417c9a67d0)
1*21943e31SAndroid Build Coastguard Worker /*
2*21943e31SAndroid Build Coastguard Worker  * XZSeekEncDemo
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  * Compresses a single file from standard input to standard ouput into
15*21943e31SAndroid Build Coastguard Worker  * a random-accessible .xz file.
16*21943e31SAndroid Build Coastguard Worker  * <p>
17*21943e31SAndroid Build Coastguard Worker  * Arguments: [preset [block size]]
18*21943e31SAndroid Build Coastguard Worker  * <p>
19*21943e31SAndroid Build Coastguard Worker  * Preset is an LZMA2 preset level which is an integer in the range [0, 9].
20*21943e31SAndroid Build Coastguard Worker  * The default is 6.
21*21943e31SAndroid Build Coastguard Worker  * <p>
22*21943e31SAndroid Build Coastguard Worker  * Block size specifies the amount of uncompressed data to store per
23*21943e31SAndroid Build Coastguard Worker  * XZ Block. The default is 1 MiB (1048576 bytes). Bigger means better
24*21943e31SAndroid Build Coastguard Worker  * compression ratio. Smaller means faster random access.
25*21943e31SAndroid Build Coastguard Worker  */
26*21943e31SAndroid Build Coastguard Worker class XZSeekEncDemo {
main(String[] args)27*21943e31SAndroid Build Coastguard Worker     public static void main(String[] args) throws Exception {
28*21943e31SAndroid Build Coastguard Worker         LZMA2Options options = new LZMA2Options();
29*21943e31SAndroid Build Coastguard Worker 
30*21943e31SAndroid Build Coastguard Worker         if (args.length >= 1)
31*21943e31SAndroid Build Coastguard Worker             options.setPreset(Integer.parseInt(args[0]));
32*21943e31SAndroid Build Coastguard Worker 
33*21943e31SAndroid Build Coastguard Worker         int blockSize = 1024 * 1024;
34*21943e31SAndroid Build Coastguard Worker         if (args.length >= 2)
35*21943e31SAndroid Build Coastguard Worker             blockSize = Integer.parseInt(args[1]);
36*21943e31SAndroid Build Coastguard Worker 
37*21943e31SAndroid Build Coastguard Worker         options.setDictSize(Math.min(options.getDictSize(),
38*21943e31SAndroid Build Coastguard Worker                                      Math.max(LZMA2Options.DICT_SIZE_MIN,
39*21943e31SAndroid Build Coastguard Worker                                               blockSize)));
40*21943e31SAndroid Build Coastguard Worker 
41*21943e31SAndroid Build Coastguard Worker         System.err.println("Encoder memory usage: "
42*21943e31SAndroid Build Coastguard Worker                            + options.getEncoderMemoryUsage() + " KiB");
43*21943e31SAndroid Build Coastguard Worker         System.err.println("Decoder memory usage: "
44*21943e31SAndroid Build Coastguard Worker                            + options.getDecoderMemoryUsage() + " KiB");
45*21943e31SAndroid Build Coastguard Worker         System.err.println("Block size:           " + blockSize + " B");
46*21943e31SAndroid Build Coastguard Worker 
47*21943e31SAndroid Build Coastguard Worker         XZOutputStream out = new XZOutputStream(System.out, options);
48*21943e31SAndroid Build Coastguard Worker 
49*21943e31SAndroid Build Coastguard Worker         byte[] buf = new byte[8192];
50*21943e31SAndroid Build Coastguard Worker         int left = blockSize;
51*21943e31SAndroid Build Coastguard Worker 
52*21943e31SAndroid Build Coastguard Worker         while (true) {
53*21943e31SAndroid Build Coastguard Worker             int size = System.in.read(buf, 0, Math.min(buf.length, left));
54*21943e31SAndroid Build Coastguard Worker             if (size == -1)
55*21943e31SAndroid Build Coastguard Worker                 break;
56*21943e31SAndroid Build Coastguard Worker 
57*21943e31SAndroid Build Coastguard Worker             out.write(buf, 0, size);
58*21943e31SAndroid Build Coastguard Worker             left -= size;
59*21943e31SAndroid Build Coastguard Worker 
60*21943e31SAndroid Build Coastguard Worker             if (left == 0) {
61*21943e31SAndroid Build Coastguard Worker                 out.endBlock();
62*21943e31SAndroid Build Coastguard Worker                 left = blockSize;
63*21943e31SAndroid Build Coastguard Worker             }
64*21943e31SAndroid Build Coastguard Worker         }
65*21943e31SAndroid Build Coastguard Worker 
66*21943e31SAndroid Build Coastguard Worker         out.finish();
67*21943e31SAndroid Build Coastguard Worker     }
68*21943e31SAndroid Build Coastguard Worker }
69