【发布时间】:2013-01-24 12:39:48
【问题描述】:
我正在尝试编写一个可以压缩数据的类。以下代码失败(不抛出异常,但目标 .gz 文件为空。)
此外:我不想像在所有示例中那样直接生成 .gz 文件。我只想得到压缩
数据,以便我可以例如在将数据写入文件之前对其进行加密。
如果我直接写入文件一切正常:
import java.io.*;
import java.util.zip.*;
import java.nio.charset.*;
public class Zipper
{
public static void main(String[] args)
{
byte[] dataToCompress = "This is the test data."
.getBytes(StandardCharsets.ISO_8859_1);
GZIPOutputStream zipStream = null;
FileOutputStream fileStream = null;
try
{
fileStream = new FileOutputStream("C:/Users/UserName/Desktop/zip_file.gz");
zipStream = new GZIPOutputStream(fileStream);
zipStream.write(dataToCompress);
fileStream.write(compressedData);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{ zipStream.close(); }
catch(Exception e){ }
try{ fileStream.close(); }
catch(Exception e){ }
}
}
}
但是,如果我想将它“绕过”到字节数组流,它不会产生单个字节 - compressedData 始终为空。
import java.io.*;
import java.util.zip.*;
import java.nio.charset.*;
public class Zipper
{
public static void main(String[] args)
{
byte[] dataToCompress = "This is the test data."
.getBytes(StandardCharsets.ISO_8859_1);
byte[] compressedData = null;
GZIPOutputStream zipStream = null;
ByteArrayOutputStream byteStream = null;
FileOutputStream fileStream = null;
try
{
byteStream = new ByteArrayOutputStream(dataToCompress.length);
zipStream = new GZIPOutputStream(byteStream);
zipStream.write(dataToCompress);
compressedData = byteStream.toByteArray();
fileStream = new FileOutputStream("C:/Users/UserName/Desktop/zip_file.gz");
fileStream.write(compressedData);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{ zipStream.close(); }
catch(Exception e){ }
try{ byteStream.close(); }
catch(Exception e){ }
try{ fileStream.close(); }
catch(Exception e){ }
}
}
}
【问题讨论】:
-
“以下代码失败”不是有效的 Java 错误消息。
-
请同时包含错误的堆栈跟踪。
-
它只是生成一个不是 ZIP 存档的文件。没有错误信息。
-
呃。没有错误消息,因为您没有在异常中记录任何内容。
-
另外,要获取压缩数据流,请使用
DeflaterOutputStream或GZipOutputStream