Compresión Zlib Uso de las clases Deflate e Inflate en Java

¿Qué está tratando de hacer aquí? ¿Utiliza un InflaterInputStream, que descomprime sus datos, y luego intenta pasar estos datos descomprimidos nuevamente a un Inflater? Use cualquiera de ellos, pero no ambos.

Esto es lo que está causando su excepción aquí.

Además de esto, hay algunos errores menores, como los mencionados por bestsss:

  • Finaliza la compresión en el bucle: después de finalizar, no se pueden agregar más datos.
  • No verifica la cantidad de salida que produce el proceso de desinflado. Si tiene líneas largas, podría tener más de 1024 bytes.
  • Usted configura la entrada al Inflater sin establecer también la longitud a.

Algunos más que encontré:

  • No cierra su FileOutputStream después de escribir (y antes de leer el mismo archivo).
  • Usted usa readLine()para leer una línea de texto, pero luego no agrega el salto de línea nuevamente, lo que significa que en su archivo descomprimido no habrá saltos de línea.
  • Convierte de bytes a cadena y a bytes nuevamente sin ninguna necesidad.
  • Crea variables que no usa más adelante.

No intentaré corregir tu programa. Aquí hay uno simple que hace lo que creo que quieres, usando DeflaterOutputStream e InflaterInputStream. (También puede usar ZInputStream y ZOutputStream de JZlib en su lugar).

import java.util.zip.*;
import java.io.*;

/**
 * Example program to demonstrate how to use zlib compression with
 * Java.
 * Inspired by http://stackoverflow.com/q/6173920/600500.
 */
public class ZlibCompression {

    /**
     * Compresses a file with zlib compression.
     */
    public static void compressFile(File raw, File compressed)
        throws IOException
    {
        InputStream in = new FileInputStream(raw);
        OutputStream out =
            new DeflaterOutputStream(new FileOutputStream(compressed));
        shovelInToOut(in, out);
        in.close();
        out.close();
    }

    /**
     * Decompresses a zlib compressed file.
     */
    public static void decompressFile(File compressed, File raw)
        throws IOException
    {
        InputStream in =
            new InflaterInputStream(new FileInputStream(compressed));
        OutputStream out = new FileOutputStream(raw);
        shovelInToOut(in, out);
        in.close();
        out.close();
    }

    /**
     * Shovels all data from an input stream to an output stream.
     */
    private static void shovelInToOut(InputStream in, OutputStream out)
        throws IOException
    {
        byte[] buffer = new byte[1000];
        int len;
        while((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
    }


    /**
     * Main method to test it all.
     */
    public static void main(String[] args) throws IOException, DataFormatException {
        File compressed = new File("book1out.dfl");
        compressFile(new File("book1"), compressed);
        decompressFile(compressed, new File("decompressed.txt"));
    }
}

Para una mayor eficiencia, podría ser útil envolver las secuencias de archivos con secuencias almacenadas en búfer. Si esto es crítico para el rendimiento, mídalo.

Respuesta 1

Después de investigar, me di cuenta de que la forma "correcta" de usar ProcessBuilder de Java es generar otros dos subprocesos para administrar engullir el stdout / stderr del proceso recién creado para que no ...

Estoy tratando de reconocer una imagen (formulario) y convertirla en texto, actualmente usando los datos de egg.trained de google "tesseract-ocr" y esto funciona bien para caracteres impresos y para uno escrito manualmente (...

Si creo clases, que se usan en este momento solo en un solo hilo, ¿debería hacerlas seguras para los hilos, incluso si no las necesito en este momento? Puede suceder que luego use esta clase en ...

public static String template = "$ A $ B" public static void somemethod () {template.replaceAll (Matcher.quoteReplacement ("$") + "A", "A"); template.replaceAll (Matcher.quoteReplacement ("$" ...