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
Antwort
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)));
}
}
ü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
Sie in 2 Bytes aus der Datei nur lesen sollte, wenn das ist alles, was Sie überprüft, es klingt wie Sie die gesamte Datei in den Speicher ziehen sind .
https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html
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.
Die Verwendung von Ausnahmen zum Steuern des Programmablaufs wird im Allgemeinen bei der letzten Prüfung als verpönt angesehen. –
Versuchen Files.probeContentType(Path) [JDK 7]
Path source = Paths.get("D:/myfiles/a.zip");
System.out.println(Files.probeContentType(source));
Ausgang
application/x-zip-compressed
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
}
}
Code anzeigen Bitte haben Sie an Möglichkeiten, um nur einen Teil lesen sah der Datei? – reto
... um die ersten 2 Bytes überprüfen zu können, wird die gesamte Datei in den Speicher geladen? – Gimby
Verwenden Sie InputStream-Unterklassen im Paket java.io – cybersoft