2016-09-15 19 views
-1

JavaのGZipに問題があります。現在、私はgzipされているファイルを扱います。 1つのgzipアーカイブに1つのファイル。そして、もしそれらを手動で解凍して解析すると、すべてが機能します。しかし、私はJavaとGZipInputStreamでこれを自動化したいが、うまくいきません。 最後にDataInputStreamが必要です。私のコードは:Java GzipInputStream into 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 ファイルは異なります:真。 7zipは問題なくファイルを解凍し、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; 
} 
関連する問題