如何在 Java 中检查文件是否为 gzip
How to check whether file is gzip or not in Java
如何在 java 中检查文件是否为 gzip。
我通过读取前 2 个字节并与魔术代码进行比较来检查。但是对于大文件得到 OutOfMemoryError。
有人知道其他方法吗?
这是我使用的代码:
def isGzipCompressionFile(File file)
{
return ((file.bytes[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (file.bytes[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8)))
}
使用我在 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)));
}
}
你应该只从文件中读取 2 个字节,如果这就是你要检查的全部内容,这听起来像是你正在将整个文件拉入内存。
https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html
使用 gzip 输入流 http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html。如果您尝试打开另一种格式,它会抛出 ZipException。在您的代码中,您可以在 catch 块中捕获此异常。
尝试Files.probeContentType(Path) [JDK 7]
Path source = Paths.get("D:/myfiles/a.zip");
System.out.println(Files.probeContentType(source));
输出
application/x-zip-compressed
这是我正在使用的
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
}
}
如何在 java 中检查文件是否为 gzip。 我通过读取前 2 个字节并与魔术代码进行比较来检查。但是对于大文件得到 OutOfMemoryError。
有人知道其他方法吗?
这是我使用的代码:
def isGzipCompressionFile(File file)
{
return ((file.bytes[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (file.bytes[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8)))
}
使用我在 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)));
}
}
你应该只从文件中读取 2 个字节,如果这就是你要检查的全部内容,这听起来像是你正在将整个文件拉入内存。
https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html
使用 gzip 输入流 http://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPInputStream.html。如果您尝试打开另一种格式,它会抛出 ZipException。在您的代码中,您可以在 catch 块中捕获此异常。
尝试Files.probeContentType(Path) [JDK 7]
Path source = Paths.get("D:/myfiles/a.zip");
System.out.println(Files.probeContentType(source));
输出
application/x-zip-compressed
这是我正在使用的
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
}
}