我使用 GZIPOutputStream 类来GZIP图像。当我尝试通过OutputStream发送GZIP文件时,我收到一个损坏的文件。我知道如何GZIP到FileOutputStream。以下代码完美无缺:
Static private void GZIPCompress(String fileName)
{
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
FileOutputStream fos = new FileOutputStream(fileName + ".gz");
GZIPOutputStream gzos = new GZIPOutputStream(fos);
gzos.write(data);
fos.close();
fis.close();
}
输出文件是myfile.png.gz并具有以下详细信息:
myfile.png.gz:gzip压缩数据,来自FAT文件系统(MS-DOS,OS / 2, NT)
我的问题是当我尝试GZIP文件并将其发送到 OutputStream 时。由于我正在使用服务器,因此我从服务器调用此服务器并使用套接字。
Static void SendGZIPFile(String fileName, OutputStream os)
{
DataOutputStream dos = new DataOutputStream(os);
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
byte[] dataAux = new byte[(int) file.length()];
dos.writeBytes("HTTP/1.1 200 OK\r\n");
dos.writeBytes("Content-Type: application/x-gzip \r\n");
dos.writeBytes("Content-Disposition: form-data; filename="+"\""+fileName+".gz"+"\""+"\n");
dos.writeBytes("\r\n\r\n");
dos = new DataOutputStream(new GZIPOutputStream(os));
fis.read(data);
dos.write(data);
dos.close();
fis.close();
gzos.close();
}
我得到的是一个没有任何内容的损坏的GZIP文件:这里是详细信息:
myfile.gz data
我认为我在GZipping时做错了,因为我注意到细节之间存在差异。我使用以下命令来获取它:file myfile.gz
答案 0 :(得分:1)
在关闭gzos
之前刷新dos
。或者先关闭gzos
。
答案 1 :(得分:1)
除了您的代码缺乏基本正确性(您可能不应该在代码中实现HTTP,更聪明的人过去已经这样做了),我认为问题在于您没有正确复制数据。相反,你应该像这样循环复制:
byte[] buf = new byte[1024];
int len;
while((len = fis.read(buf)) != -1)
{
dos.write(buf, 0, len);
}
或者您可以使用Apache Commons IO:
IOUtils.copy(fis, dos);