1

通常のファイルを .zip に圧縮し、新しいファイルを作成せずに gzip ファイルとして圧縮したい。

たとえば、pdf ドキュメントdoc.pdfがあるとします。取得する必要があるのは次のとおりです。doc.pdf.zip.gz

doc.pdf.zipという名前の新しいファイルを作成してから開き、gzip したくありません。

サーバーを使用してブラウザからファイルを取得し、それを返します。これが私の機能です。

 public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException
 {
    File file = new File(fileName);
    FileInputStream fis = new FileInputStream(file);
    byte[] data = new byte[(int) file.length()];
    DataOutputStream dos = new DataOutputStream(os);
    try {
        dos.writeBytes(header);
        ZipOutputStream zpos = new ZipOutputStream(os); 
        zpos.putNextEntry(new ZipEntry(fileName));
        GZIPOutputStream gos = (new GZIPOutputStream(zpos));
        fis.read(data);
        gos.write(data);

        zpos.flush();
        zpos.close();
        gos.flush();
        gos.close();
        dos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

ファイルを取得しましたdoc.pdf.zip.gzが、破損したファイルがdoc.pdfあり、圧縮されていません。なぜですか??

4

1 に答える 1

2

zip の一時ファイルを作成して gzip に追加し、作成された zip を削除できると思います。以下のコード サンプルは、その手助けとなるはずです。

public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException {
    byte[] buffer = new byte[1024];
    FileInputStream fis = null;
    FileOutputStream fos = null;
    ZipOutputStream zos = null;
    File tempZipFile = File.createTempFile(fileName, ".zip")
    try {
        fos = new FileOutputStream(tempZipFile);
        zos = new ZipOutputStream(fos);
        ZipEntry ze = new ZipEntry(fileName);
        zos.putNextEntry(ze);
        fis = new FileInputStream(fileName);

        int len;
        while ((len = fis.read(buffer)) > 0) {
            zos.write(buffer, 0, len);
        }
        zos.closeEntry();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (fis != null) {
            fis.close();
        }
        if (zos != null) {
            zos.close();
        }
        if (fos != null) {
            fos.close();
        }
    }

    addGzipFileToStream(tempZipFile, os, header);
}

private void addGzipFileToStream(File zipFile, OutputStream os, String header) throws FileNotFoundException {

    byte[] buffer = new byte[1024];
    DataOutputStream dos = null;
    GZIPOutputStream gzos = null;
    FileInputStream inputStream = null;
    try {
        dos = new DataOutputStream(os);
        dos.writeBytes(header);

        gzos = new GZIPOutputStream(os);
        inputStream = new FileInputStream(zipFile);

        int len;
        while ((len = inputStream.read(buffer)) > 0) {
            gzos.write(buffer, 0, len);
        }
        gzos.finish();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
        if (gzos != null) {
            gzos.close();
        }
        if (dos != null) {
            dos.close();
        }
        zipFile.delete();
    }
}

それが役に立てば幸い。

于 2016-03-28T14:26:02.347 に答える