我想我错过了很简单的事情.我有一个字节数组,使用Deflater保存写入其中的缩小数据:
deflate(outData, 0, BLOCK_SIZE, SYNC_FLUSH)
Run Code Online (Sandbox Code Playgroud)
我不仅使用GZIPOutputStream的原因是因为有4个线程(变量),每个线程都被赋予一个数据块,每个线程在将压缩数据存储到全局字节数组之前压缩它自己的块.如果我使用GZIPOutputStream它会混淆格式,因为每个小块都有一个标题和预告片,它是自己的gzip数据(我只想压缩它).
所以最后,我得到了这个byteArray,outData,它保存了我所有的压缩数据,但我不确定如何包装它.GZIPOutputStream从具有未压缩数据的缓冲区写入,但此数组全部已设置.它已经被压缩了,我只是试图弄清楚如何将它变成一个表格.
编辑:好的,我的措辞不好.我将它写入输出,而不是文件,以便在需要时可以重定向.一个非常简单的例子是
cat file.txt | java Jzip | gzip -d | cmp file.txt
Run Code Online (Sandbox Code Playgroud)
应该返回0.现在的问题是如果我按原样编写这个字节数组来输出,它只是"原始"压缩数据.我认为gzip需要所有这些额外的信息.
如果有另一种方法,那就没问题了.这样的全部原因是因为我需要使用多个线程.否则我只会调用GZIPOutputStream.
DOUBLE EDIT:由于评论提供了很多好的见解,另一种方法是我只有一堆未压缩的数据块,这些数据块原本是一个长流.如果gzip可以读取连接流,如果我接受了这些块(并按顺序保存它们)并将每个块分配给一个在自己的块上调用GZIPOutputStream的线程,然后取结果并连接它们.实质上,每个块现在都有标题,压缩信息和预告片.如果我连接它们,gzip会认识到吗?
例:
cat file.txt
Hello world! How are you? I'm ready to set fire to this assignment.
java Testcase < file.txt > file.txt.gz
Run Code Online (Sandbox Code Playgroud)
所以我从输入中接受它.在程序内部,流被分成"Hello world!"."你好吗?" "我准备放火烧这个任务"(它们不是字符串,它只是一个字节数组!这只是插图)
所以我有三个字节块,都是未压缩的.我将每个块都给了一个使用的线程
public static class DGZIPOutputStream extends GZIPOutputStream
{
public DGZIPOutputStream(OutputStream out, boolean flush) throws IOException
{
super(out, flush);
}
public void setDictionary(byte[] b)
{
def.setDictionary(b);
}
public void updateCRC(byte[] input)
{
crc.update(input); …Run Code Online (Sandbox Code Playgroud)