2015-05-28 2 views
5

Wie überprüft man, ob die Datei gzip ist oder nicht in Java. Ich überprüfte, indem ich zuerst 2 Bytes las und mit dem magischen Code verglich. Aber für große Dateigröße OutOfMemoryError bekommen. Jeder weiß einen anderen Weg, dies zu tun?Wie überprüft man, ob die Datei gzip ist oder nicht in Java

+0

Code anzeigen Bitte haben Sie an Möglichkeiten, um nur einen Teil lesen sah der Datei? – reto

+1

... um die ersten 2 Bytes überprüfen zu können, wird die gesamte Datei in den Speicher geladen? – Gimby

+0

Verwenden Sie InputStream-Unterklassen im Paket java.io – cybersoft

Antwort

4

Verwenden Sie dieses Paket, das ich auf Google gefunden:

package example; 
  
import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.RandomAccessFile; 
import java.util.zip.GZIPInputStream; 
  
public class GZipUtil { 
  
 /** 
  * Checks if an input stream is gzipped. 
  * 
  * @param in 
  * @return 
  */ 
 public static boolean isGZipped(InputStream in) { 
  if (!in.markSupported()) { 
   in = new BufferedInputStream(in); 
  } 
  in.mark(2); 
  int magic = 0; 
  try { 
   magic = in.read() & 0xff | ((in.read() << 8) & 0xff00); 
   in.reset(); 
  } catch (IOException e) { 
   e.printStackTrace(System.err); 
   return false; 
  } 
  return magic == GZIPInputStream.GZIP_MAGIC; 
 } 
  
 /** 
  * Checks if a file is gzipped. 
  * 
  * @param f 
  * @return 
  */ 
 public static boolean isGZipped(File f) { 
  int magic = 0; 
  try { 
   RandomAccessFile raf = new RandomAccessFile(f, "r"); 
   magic = raf.read() & 0xff | ((raf.read() << 8) & 0xff00); 
   raf.close(); 
  } catch (Throwable e) { 
   e.printStackTrace(System.err); 
  } 
  return magic == GZIPInputStream.GZIP_MAGIC; 
 } 
  
 public static void main(String[] args) throws FileNotFoundException { 
  File gzf = new File("/tmp/1.gz"); 
  
  // Check if a file is gzipped. 
  System.out.println(isGZipped(gzf)); 
  
  // Check if a input stream is gzipped. 
  System.out.println(isGZipped(new FileInputStream(gzf))); 
 } 
} 
+0

überprüfen Wenn das zweite 'read()' 'IOException' auslöst, hätten Sie ein Byte verbraucht. Wenn 'in' -Parameter' mark' nicht unterstützt, macht das Umbrechen mit 'BufferedInputStream' keinen Unterschied: Sie würden immer noch 2 Bytes aus dem Ihnen zugewiesenen Stream verbrauchen. In beiden Fällen ist dem Aufrufer nicht bewusst, dass "isGZipped" gestohlene Bytes hat. Entschuldigung, ich muss abstimmen. – Andreas

2

einen gzip Eingabestrom http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html Gebrauch. Wenn Sie versuchen, ein anderes Format zu öffnen, wird eine ZipException ausgelöst. In Ihrem Code können Sie diese Ausnahme in einem Catchblock abfangen.

+0

Die Verwendung von Ausnahmen zum Steuern des Programmablaufs wird im Allgemeinen bei der letzten Prüfung als verpönt angesehen. –

0

Dies ist, was ich bin mit

private static void decompressGzipFile(String gzipFilePath, String newFilePath) { 
     try { 
      FileInputStream fis = new FileInputStream(gzipFile); 
      GZIPInputStream gis = new GZIPInputStream(fis); 
      // If this line does not throw exception your file is GZip 
      // Your logic 


     } catch (IOException e) { 
      //Not in GZip Format 
     } 

    }