/** * Takes a packed-stream InputStream, and writes to a JarOutputStream. Internally the entire * buffer must be read, it may be more efficient to read the packed-stream to a file and pass the * File object, in the alternate method described below. * * <p>Closes its input but not its output. (The output can accumulate more elements.) * * @param in an InputStream. * @param out a JarOutputStream. * @exception IOException if an error is encountered. */ public void unpack(InputStream in0, JarOutputStream out) throws IOException { assert (Utils.currentInstance.get() == null); TimeZone tz = (_props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE)) ? null : TimeZone.getDefault(); try { Utils.currentInstance.set(this); if (tz != null) TimeZone.setDefault(TimeZone.getTimeZone("UTC")); final int verbose = _props.getInteger(Utils.DEBUG_VERBOSE); BufferedInputStream in = new BufferedInputStream(in0); if (Utils.isJarMagic(Utils.readMagic(in))) { if (verbose > 0) Utils.log.info("Copying unpacked JAR file..."); Utils.copyJarFile(new JarInputStream(in), out); } else if (_props.getBoolean(Utils.DEBUG_DISABLE_NATIVE)) { (new DoUnpack()).run(in, out); in.close(); Utils.markJarFile(out); } else { (new NativeUnpack(this)).run(in, out); in.close(); Utils.markJarFile(out); } } finally { _nunp = null; Utils.currentInstance.set(null); if (tz != null) TimeZone.setDefault(tz); } }
/** * Takes an input File containing the pack file, and generates a JarOutputStream. * * <p>Does not close its output. (The output can accumulate more elements.) * * @param in a File. * @param out a JarOutputStream. * @exception IOException if an error is encountered. */ public void unpack(File in, JarOutputStream out) throws IOException { // Use the stream-based implementation. // %%% Reconsider if native unpacker learns to memory-map the file. FileInputStream instr = new FileInputStream(in); unpack(instr, out); if (_props.getBoolean(Utils.UNPACK_REMOVE_PACKFILE)) { in.delete(); } }