如何在Java上GZIP文件并通过OutputStream发送它

时间:2016-03-24 17:59:46

标签: java sockets server gzip

我使用 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

2 个答案:

答案 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);