Что вы пытаетесь сделать здесь? Вы используете InflaterInputStream, который распаковывает ваши данные, а затем пытаетесь снова передать эти распакованные данные в Inflater? Используйте любой из них, но не оба.
Это то, что вызывает ваше исключение здесь.
В дополнение к этому, есть некоторые незначительные ошибки, подобные упомянутым bestsss:
- Вы завершаете сжатие в цикле - после завершения больше данные не могут быть добавлены.
- Вы не проверяете, сколько выводит процесс дефляции. Если у вас длинные строки, это может быть больше 1024 байтов.
- Вы устанавливаете вход для инфлятора без установки длины
a
.
Еще кое-что, что я нашел:
- Вы не закрываете свой FileOutputStream после записи (и до чтения из того же файла).
- Вы используете
readLine()
для чтения строки текста, но затем вы не добавляете разрыв строки снова, что означает, что в вашем распакованном файле не будет разрывов строки.
- Вы конвертируете из байтов в строку и в байты снова без необходимости.
- Вы создаете переменные, которые не будете использовать позже.
Я не буду пытаться исправить вашу программу. Вот простой, который делает то, что я думаю, вы хотите, используя DeflaterOutputStream и InflaterInputStream. (Вы могли бы также использовать ZZputbream и ZOutputStream JZlib вместо этого.)
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"));
}
}
Для большей эффективности может быть полезно обернуть потоки файлов буферизованными потоками. Если это критично для производительности, измерьте это.