/* * #%L * Common package for I/O and related utilities * %% * Copyright (C) 2005 - 2015 Open Microscopy Environment: * - Board of Regents of the University of Wisconsin-Madison * - Glencoe Software, Inc. * - University of Dundee * %% * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * #L% */ package loci.common; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; /** * StreamHandle implementation for reading from gzip-compressed files * or byte arrays. Instances of GZipHandle are read-only. * * @see StreamHandle * * @author Melissa Linkert melissa at glencoesoftware.com */ public class GZipHandle extends StreamHandle { // -- Constructor -- /** * Construct a new GZipHandle for the given file. * * @throws HandleException if the given file name is not a GZip file. */ public GZipHandle(String file) throws IOException { super(); this.file = file; if (!isGZipFile(file)) { throw new HandleException(file + " is not a gzip file."); } resetStream(); length = 0; while (true) { int skip = stream.skipBytes(1024); if (skip <= 0) break; length += skip; } resetStream(); } // -- GZipHandle API methods -- /** Returns true if the given filename is a gzip file. */ public static boolean isGZipFile(String file) throws IOException { if (!file.toLowerCase().endsWith(".gz")) return false; FileInputStream s = new FileInputStream(file); byte[] b = new byte[2]; s.read(b); s.close(); return DataTools.bytesToInt(b, true) == GZIPInputStream.GZIP_MAGIC; } // -- StreamHandle API methods -- /* @see StreamHandle#resetStream() */ @Override protected void resetStream() throws IOException { if (stream != null) stream.close(); BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file), RandomAccessInputStream.MAX_OVERHEAD); stream = new DataInputStream(new GZIPInputStream(bis)); } }