开发者

java gzip can't keep original file's extension name

I'm using GZIPOutputStream to gzip one xml file to gz file, but after zipping I find the extension name of the xml file (.xml) is missing in the gz file hierarchy. I need to keep the extension name because the zipped gz file will be used by third party system which expects getting a .xml file after unzipping gz file. Are there any solutions for this? My test code is:

public static void main(String[] args) {
    compress("D://test.xml", "D://test.gz");
}

private static boolean compress(String inputFileName, String targetFileName){
     boolean compressResult=true;
     int BUFFER = 1024*4;
     byte[] B_ARRAY = new byte[BUFFER]; 开发者_高级运维
     FileInputStream fins=null;
     FileOutputStream fout=null;
     GZIPOutputStream zout=null;
     try{
         File srcFile=new File(inputFileName);
         fins=new FileInputStream (srcFile);
         File tatgetFile=new File(targetFileName);
         fout = new FileOutputStream(tatgetFile);
         zout = new GZIPOutputStream(fout);
         int number = 0; 
         while((number = fins.read(B_ARRAY, 0, BUFFER)) != -1){
             zout.write(B_ARRAY, 0, number);  
         }
     }catch(Exception e){
         e.printStackTrace();
         compressResult=false;
     }finally{
         try {
            zout.close();
            fout.close();
            fins.close();
        } catch (IOException e) {
            e.printStackTrace();
            compressResult=false;
        }
     }
     return compressResult;
}


Maybe I'm missing something, but when I've gzipped files in the past, say test.xml, the output I get would be test.xml.gz. Perhaps if you changed the output filename to test.xml.tz you would still preserve your original file extension.


Not sure what the problem is here, you are calling your own compress function

private static boolean compress(String inputFileName, String targetFileName)

with the following arguments

compress("D://test.xml", "D://test.gz");

Quite obviously you are going to lose the .xml portion of the filename, you never pass it into your method.


Your code is perfectly fine. give the output file names as "D://test.xml.gz" you missed the file extension(.xml).

   Ex: compress("D://test.xml", "D://test.xml.gz");


You can also use an ArchiveOutput stream (like Tar) before GZipping it.


Use the ZipOutputStream with ZipEntry instead of GZipOutputStream. so that it will keep the original file extension.

Sample code as below..

ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFile));
    FileInputStream inStream = new FileInputStream(file); // Stream to read file
    ZipEntry entry = new ZipEntry(file.getPath()); // Make a ZipEntry
    zipOutStream.putNextEntry(entry); // Store entry


I created a copy of GZIPOutputStream and changed the code to allow for a different filename "in the gzip":

private final byte[] header = {
    (byte) GZIP_MAGIC,                // Magic number (short)
    (byte)(GZIP_MAGIC >> 8),          // Magic number (short)
    Deflater.DEFLATED,                // Compression method (CM)
    8,                                // Flags (FLG)
    0,                                // Modification time MTIME (int)
    0,                                // Modification time MTIME (int)
    0,                                // Modification time MTIME (int)
    0,                                // Modification time MTIME (int)
    0,                                // Extra flags (XFLG)
    0                                 // Operating system (OS)
};

private void writeHeader() throws IOException {
    out.write(header);
    out.write("myinternalfilename".getBytes());
    out.write(new byte[] {0});
}

Info about gzip format: http://www.gzip.org/zlib/rfc-gzip.html#specification


I also had the same issue, I found that (apache) commons-compress has a similar class - GzipCompressorOutputStream that can be configured with parameters.

        final File compressedFile = new File("test-outer.xml.gz");
        final GzipParameters gzipParameters = new GzipParameters();
        gzipParameters.setFilename("test-inner.xml");
        final GzipCompressorOutputStream gzipOutputStream = new GzipCompressorOutputStream(new FileOutputStream(compressedFile), gzipParameters);

Dependency:

        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-compress</artifactId>
          <version>1.8</version>
        </dependency>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜