如何在Java中检查文件是否为gzip
如何在java中检查文件是否为gzip。 我通过读取前2个字节并与magic代码进行比较进行检查。但是对于大文件来说,从内存中取出错误 有人知道其他方法吗 这是我正在使用的代码:如何在Java中检查文件是否为gzip,java,gzip,Java,Gzip,如何在java中检查文件是否为gzip。 我通过读取前2个字节并与magic代码进行比较进行检查。但是对于大文件来说,从内存中取出错误 有人知道其他方法吗 这是我正在使用的代码: def isGzipCompressionFile(File file) { return ((file.bytes[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (file.bytes[1] == (byte) (GZIPInputStream.GZ
def isGzipCompressionFile(File file)
{
return ((file.bytes[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) && (file.bytes[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8)))
}
使用我在谷歌上找到的这个软件包:
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)));
}
}
包示例;
导入java.io.BufferedInputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.RandomAccessFile;
导入java.util.zip.gzip输入流;
公共类GZipUtil{
/**
*检查输入流是否已gzip。
*
*@param-in
*@返回
*/
公共静态布尔值isgzip(InputStream-in){
如果(!in.markSupported()){
in=新的BufferedInputStream(in);
}
in.标记(2);
int-magic=0;
试一试{
magic=in.read()&0xff |((in.read()您应该只从文件中读取2个字节。如果这就是您要检查的全部内容,听起来就像您正在将整个文件拉入内存
使用gzip输入流。如果您尝试打开另一种格式,它会引发ZipException。在代码中,您可以在catchblock中捕获此异常。试试看
输出
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
}
}
请显示您的代码,您是否考虑过只读取文件的一部分的方法?…以便能够检查将整个文件装入内存的前2个字节?使用包java.io中的InputStream子类您还可以检查第二个read()
抛出IOException
,您将消耗一个字节。如果中的参数不支持标记
,使用BufferedInputStream
包装不会有什么区别:您仍然会从提供给您的流中消耗2个字节。在这两种情况下,调用方都不知道是被压缩的
盗用了字节。对不起,我已经这样做了使用异常来控制程序流通常是我上次检查时不赞成的。@MattLachman试着告诉python开发人员,看看你得到了什么样的响应。它只检查扩展名。如果我们更改扩展名,输出也会更改。因此,检查幻数以确定文件类型是安全的。
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
}
}