Comment vérifier si InputStream est au Format gzip?

Est-il un moyen de vérifier si InputStream a été gzippé?
Voici le code:

public static InputStream decompressStream(InputStream input) {
    try {
        GZIPInputStream gs = new GZIPInputStream(input);
        return gs;
    } catch (IOException e) {
        logger.info("Input stream not in the GZIP format, using standard format");
        return input;
    }
}

J'ai essayé de cette façon, mais il ne fonctionne pas comme prévu, les valeurs lues à partir du flux ne sont pas valides.
EDIT:
Ajout de la méthode que j'utilise pour compresser des données:

public static byte[] compress(byte[] content) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        GZIPOutputStream gs = new GZIPOutputStream(baos);
        gs.write(content);
        gs.close();
    } catch (IOException e) {
        logger.error("Fatal error occured while compressing data");
        throw new RuntimeException(e);
    }
    double ratio = (1.0f * content.length / baos.size());
    if (ratio > 1) {
        logger.info("Compression ratio equals " + ratio);
        return baos.toByteArray();
    }
    logger.info("Compression not needed");
    return content;

}
  • D'où vient le InputStream viennent? De URLConnection#getInputStream()? Dans un peu décent protocole HTTP, l'utilisateur doit déjà être chargé en quelque sorte que le contenu est au format gzip.
  • Étant donné que GZIP est un 32 bits CRC, je trouve cela surprenant. Une corruption du flux doit lever une exception, à la fin, au moins.
  • Je me demandais si l'OP signifie que les valeurs lues à partir du flux APRÈS la IOException se produit ne sont pas valides... qui a du sens parce que la GZIPInputStream constructeur aurait consommé certains des octets dans le flux.
  • Les valeurs sont endommagés après l'IOException s'est produite. L'InputStream vient de HttpURLConnection#getInputStream()
  • À droite, c'est parce que la GZipInputStream lit les octets à partir de l'origine du flux d'entrée. Si vous avez besoin de la mémoire tampon du flux d'entrée, comme indiqué dans la réponse ci-dessous.
  • Donc la solution générale est de créer un BufferedInputStream l'emballage d'origine du flux d'entrée, puis d'appeler la "marque" pour marquer le début du flux. Puis les envelopper d'une GZipInputStream autour de cela. Si aucune exception ne se produit, le retour de la GZipInputStream. Si une exception se produit, appelez le "reset" et le retour de la BufferedInputStream.

InformationsquelleAutor voo | 2011-01-27