1*21943e31SAndroid Build Coastguard Worker /* 2*21943e31SAndroid Build Coastguard Worker * LZMADecDemo 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 .lzma files to standard output. If no arguments are given, 15*21943e31SAndroid Build Coastguard Worker * reads from standard input. 16*21943e31SAndroid Build Coastguard Worker * 17*21943e31SAndroid Build Coastguard Worker * NOTE: For most purposes, .lzma is a legacy format and usually you should 18*21943e31SAndroid Build Coastguard Worker * use .xz instead. 19*21943e31SAndroid Build Coastguard Worker */ 20*21943e31SAndroid Build Coastguard Worker class LZMADecDemo { main(String[] args)21*21943e31SAndroid Build Coastguard Worker public static void main(String[] args) { 22*21943e31SAndroid Build Coastguard Worker byte[] buf = new byte[8192]; 23*21943e31SAndroid Build Coastguard Worker String name = null; 24*21943e31SAndroid Build Coastguard Worker 25*21943e31SAndroid Build Coastguard Worker try { 26*21943e31SAndroid Build Coastguard Worker if (args.length == 0) { 27*21943e31SAndroid Build Coastguard Worker name = "standard input"; 28*21943e31SAndroid Build Coastguard Worker 29*21943e31SAndroid Build Coastguard Worker // No need to use BufferedInputStream with System.in which 30*21943e31SAndroid Build Coastguard Worker // seems to be fast with one-byte reads. 31*21943e31SAndroid Build Coastguard Worker InputStream in = new LZMAInputStream(System.in); 32*21943e31SAndroid Build Coastguard Worker 33*21943e31SAndroid Build Coastguard Worker int size; 34*21943e31SAndroid Build Coastguard Worker while ((size = in.read(buf)) != -1) 35*21943e31SAndroid Build Coastguard Worker System.out.write(buf, 0, size); 36*21943e31SAndroid Build Coastguard Worker 37*21943e31SAndroid Build Coastguard Worker } else { 38*21943e31SAndroid Build Coastguard Worker // Read from files given on the command line. 39*21943e31SAndroid Build Coastguard Worker for (int i = 0; i < args.length; ++i) { 40*21943e31SAndroid Build Coastguard Worker name = args[i]; 41*21943e31SAndroid Build Coastguard Worker InputStream in = new FileInputStream(name); 42*21943e31SAndroid Build Coastguard Worker 43*21943e31SAndroid Build Coastguard Worker try { 44*21943e31SAndroid Build Coastguard Worker // In contrast to other classes in org.tukaani.xz, 45*21943e31SAndroid Build Coastguard Worker // LZMAInputStream doesn't do buffering internally 46*21943e31SAndroid Build Coastguard Worker // and reads one byte at a time. BufferedInputStream 47*21943e31SAndroid Build Coastguard Worker // gives a huge performance improvement here but even 48*21943e31SAndroid Build Coastguard Worker // then it's slower than the other input streams from 49*21943e31SAndroid Build Coastguard Worker // org.tukaani.xz. 50*21943e31SAndroid Build Coastguard Worker in = new BufferedInputStream(in); 51*21943e31SAndroid Build Coastguard Worker in = new LZMAInputStream(in); 52*21943e31SAndroid Build Coastguard Worker 53*21943e31SAndroid Build Coastguard Worker int size; 54*21943e31SAndroid Build Coastguard Worker while ((size = in.read(buf)) != -1) 55*21943e31SAndroid Build Coastguard Worker System.out.write(buf, 0, size); 56*21943e31SAndroid Build Coastguard Worker 57*21943e31SAndroid Build Coastguard Worker } finally { 58*21943e31SAndroid Build Coastguard Worker // Close FileInputStream (directly or indirectly 59*21943e31SAndroid Build Coastguard Worker // via LZMAInputStream, it doesn't matter). 60*21943e31SAndroid Build Coastguard Worker in.close(); 61*21943e31SAndroid Build Coastguard Worker } 62*21943e31SAndroid Build Coastguard Worker } 63*21943e31SAndroid Build Coastguard Worker } 64*21943e31SAndroid Build Coastguard Worker } catch (FileNotFoundException e) { 65*21943e31SAndroid Build Coastguard Worker System.err.println("LZMADecDemo: Cannot open " + name + ": " 66*21943e31SAndroid Build Coastguard Worker + e.getMessage()); 67*21943e31SAndroid Build Coastguard Worker System.exit(1); 68*21943e31SAndroid Build Coastguard Worker 69*21943e31SAndroid Build Coastguard Worker } catch (EOFException e) { 70*21943e31SAndroid Build Coastguard Worker System.err.println("LZMADecDemo: Unexpected end of input on " 71*21943e31SAndroid Build Coastguard Worker + name); 72*21943e31SAndroid Build Coastguard Worker System.exit(1); 73*21943e31SAndroid Build Coastguard Worker 74*21943e31SAndroid Build Coastguard Worker } catch (IOException e) { 75*21943e31SAndroid Build Coastguard Worker System.err.println("LZMADecDemo: Error decompressing from " 76*21943e31SAndroid Build Coastguard Worker + name + ": " + e.getMessage()); 77*21943e31SAndroid Build Coastguard Worker System.exit(1); 78*21943e31SAndroid Build Coastguard Worker } 79*21943e31SAndroid Build Coastguard Worker } 80*21943e31SAndroid Build Coastguard Worker } 81