2016-09-15 12 views
-1

У меня проблема с GZip в Java. В настоящее время я работаю с файлами, которые gzipped. Один файл в одном архиве gzip. И если я распаковываю их вручную, а затем разбираю их, все работает. Но я хочу автоматизировать это с помощью Java и GZipInputStream, но это не сработает. Мне нужно иметь DataInputStream в конце. Мой код:Java GzipInputStream в DataInputStream

byte[] bytesArray = Files.readAllBytes(baseFile.toPath()); 

    try { 
     reader = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(bytesArray))); 
     System.out.println("gzip"); 
    } catch (ZipException notZip) { 
     reader = new DataInputStream(new ByteArrayInputStream(bytesArray)); 
     System.out.println("no gzip"); 
    } 

Я также попробовал новый GZIPInputStream (новый FileInputStream (baseFile)); Результат тот же. Из-за вывода я вижу, что поток Gzip создается без исключения, но позже я получаю недопустимые данные из DataInputStream. Пожалуйста, помогите :)

+0

недопустимые данные, такие как, что? Когда должны были быть действительные данные? Написано как? – EJP

+0

Извините :) reader.readByte() предоставляет разные результаты, если я использую оригинальный файл или версию gzipped. – kapodes

ответ

0

Я побежал следующий код без проблем

public static void main(String[] args) throws IOException { 
    byte[] originalBytesArray = Files.readAllBytes(new File("OrdLog.BR-1.17.2016-09-12.bin").toPath()); 
    byte[] bytesArray = Files.readAllBytes(new File("OrdLog.BR-1.17.2016-09-12.bin.gz").toPath()); 
    DataInputStream reader = null; 
    try { 
     reader = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(bytesArray))); 
     System.out.println("gzip"); 
    } catch (ZipException notZip) { 
     reader = new DataInputStream(new ByteArrayInputStream(bytesArray)); 
     System.out.println("no gzip"); 
    } 
    byte[] uncompressedBytesArray = new byte[originalBytesArray.length]; 
    reader.readFully(uncompressedBytesArray); 
    reader.close(); 
    boolean filesDiffer = false; 
    for (int i = 0; i < uncompressedBytesArray.length; i++) { 
     if (originalBytesArray[i] != uncompressedBytesArray[i]) { 
      filesDiffer = true; 
     } 
    } 
    System.out.println("Files differ: " + filesDiffer); 
} 

Он считывает файл GZIP и несжатый файл и сравнивает содержание. Он печатает файлы различаются: false. Если он не для ваших файлов, чем файлы, не то же самое.

+0

Моя проблема в том, что я использую метод .readByte() и, кажется, читает разные данные, если я использую несжатый источник. Можете ли вы протестировать этот метод и сравнить его с исходным файлом? – kapodes

+0

Я провела тест: gzip Файлы разные: true. 7zip uncomplresses file без проблем и говорит, что это архив gzip. И я не получаю исключения. – kapodes

+0

Я собирался попросить файл :-) Thx для его обеспечения. Я ошибся при чтении сжатого файла. Я изменил его, чтобы использовать readFully, чтобы сделать код проще. Он не показывает никакой разницы – Guenther

0

Мое окончательное решение:

try { 
     byte[] gzipBytes = new byte[getUncompressedFileSize()]; 
     new DataInputStream(new GZIPInputStream(new FileInputStream(baseFile))).readFully(gzipBytes); 
     reader = new DataInputStream(new ByteArrayInputStream(gzipBytes)); 
    } catch (ZipException notZip) { 
     byte[] bytesArray = Files.readAllBytes(baseFile.toPath()); 
     reader = new DataInputStream(new ByteArrayInputStream(bytesArray)); 
    } 

private int getUncompressedFileSize() throws IOException { 
    //last 4 bytes of file is size of original file if it is less than 2GB 
    RandomAccessFile raf = new RandomAccessFile(baseFile, "r"); 
    raf.seek(raf.length() - 4); 
    int b4 = raf.read(); 
    int b3 = raf.read(); 
    int b2 = raf.read(); 
    int b1 = raf.read(); 
    int val = (b1 << 24) | (b2 << 16) + (b3 << 8) + b4; 
    raf.close(); 
    return val; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^