2015-05-28 11 views
5

Jak sprawdzić, czy plik jest gzip, czy nie w java. Sprawdziłem, czytając pierwsze 2 bajty i porównując z magicznym kodem. Ale w przypadku dużych plików pobieranie OutOfMemoryError. Ktoś wie w inny sposób to zrobić?Jak sprawdzić, czy plik jest gzip lub nie w java

+0

Pokaż swój kod proszę, masz spojrzał na sposobów, aby tylko czytać część pliku? – reto

+1

... więc aby móc sprawdzić pierwsze 2 bajty, w których cały plik zapełniasz w pamięci? – Gimby

+0

użyć podklas InputStream w pakiecie java.io – cybersoft

Odpowiedz

4

użyć tego pakietu, który znalazłem na google:

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

Jeśli drugi 'read()' wyrzuci 'IOException', zużyjesz bajt. Jeśli parametr 'in' nie obsługuje' mark', zawijanie przy użyciu 'BufferedInputStream' nie ma znaczenia: Nadal zużywałbyś 2 bajty ze strumienia, który otrzymałeś. W obu przypadkach osoba dzwoniąca nie jest świadoma, że ​​"jest GZipped". Przepraszam, muszę głosować w dół. – Andreas

0

To właśnie używam

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 
     } 

    } 
Powiązane problemy