java gzip can't keep original file's exten

2019-05-10 08:03发布

问题:

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;
}

回答1:

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.



回答2:

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");


回答3:

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.



回答4:

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



回答5:

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


回答6:

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



标签: java gzip