Java GZIP не может сохранить расширение имени исходного файла - PullRequest
3 голосов
/ 27 сентября 2011

Я использую GZIPOutputStream для gzip-файла одного XML-файла в файл gz, но после архивирования я нахожу, что расширение имени файла XML (.xml) отсутствует в иерархии файлов gz. Мне нужно сохранить имя расширения, потому что заархивированный файл gz будет использоваться сторонней системой, которая ожидает получить файл .xml после распаковки файла gz. Есть ли какие-то решения для этого? Мой тестовый код:

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

Ответы [ 6 ]

4 голосов
/ 27 сентября 2011

Не уверен, в чем проблема, вы вызываете свою собственную функцию сжатия

private static boolean compress(String inputFileName, String targetFileName)

со следующими аргументами

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

Совершенно очевидно, что вы потеряете XML-часть имени файла, вы никогда не передадите ее в свой метод.

3 голосов
/ 27 сентября 2011

Ваш код в порядке. дать имена выходных файлов как "D: //test.xml.gz", вы пропустили расширение файла (.xml).

   Ex: compress("D://test.xml", "D://test.xml.gz");
2 голосов
/ 27 сентября 2011

Может быть, я что-то упускаю, но когда я в прошлом разархивировал файлы, скажем, test.xml, я получу вывод test.xml.gz.Возможно, если вы измените имя выходного файла на test.xml.tz, вы все равно сохраните исходное расширение файла.

1 голос
/ 02 ноября 2011

Используйте ZipOutputStream с ZipEntry вместо GZipOutputStream. так что он сохранит исходное расширение файла.

Пример кода, как показано ниже.

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
1 голос
/ 27 сентября 2011

Вы также можете использовать поток ArchiveOutput (например, Tar) перед GZipping его.

0 голосов
/ 27 февраля 2014

Я создал копию GZIPOutputStream и изменил код, чтобы разрешить использовать другое имя файла "в 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});
}

Информация о формате gzip: http://www.gzip.org/zlib/rfc-gzip.html#specification

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...