import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureSettingsModelI;
+import jalview.bin.Cache;
import jalview.util.MessageManager;
import java.io.BufferedInputStream;
}
return error;
}
-
+
/**
- * Recognise the 2-byte magic header for gzip streams
+ * Recognise the 2-byte magic header indicating a gzipped stream
*
+ * see
* https://recalll.co/ask/v/topic/java-How-to-check-if-InputStream-is-Gzipped/555aadd62bd27354438b90f6
*
- * @param bytes - at least two bytes
- * @return
+ * @param input
+ * - input stream that supports mark and contains at least two bytes
+ *
+ * @return false if mark not supported or no magic header found
+ *
+ * @throws IOException
*/
- private static boolean isGzipStream(byte[] bytes) {
- int head = ((int) bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
- return (GZIPInputStream.GZIP_MAGIC == head);
+ public static boolean isGzipStream(InputStream input) throws IOException
+ {
+ if (!input.markSupported())
+ {
+ Cache.log.error(
+ "FileParse.izGzipStream: input stream must support mark/reset");
+ return false;
+ }
+ input.mark(4);
+
+ // get first 2 bytes or return false
+ byte[] bytes = new byte[2];
+ int read = input.read(bytes);
+ input.reset();
+ if (read != bytes.length)
+ {
+ return false;
+ }
+
+ int header = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
+ return (GZIPInputStream.GZIP_MAGIC == header);
}
/**
// NB: stackoverflow https://stackoverflow.com/questions/4818468/how-to-check-if-inputstream-is-gzipped
// could use a PushBackInputStream rather than a BufferedInputStream
-
- BufferedInputStream bufinput;
+
if (!input.markSupported()) {
- bufinput= new BufferedInputStream(input,16);
- input = bufinput;
+ input = new BufferedInputStream(input,16);
}
- input.mark(4);
- byte[] bytes=input.readNBytes(2);
- input.reset();
- if (bytes.length==2 && isGzipStream(bytes)) {
+ if (isGzipStream(input)) {
return getGzipReader(input);
}
// return a buffered reader for the stream.