2012-09-10 78 views
1

嗨,大家好心的读这个。检测压缩文件java

我正在使用Java程序,我没有做到,但即时提炼它,问题是你可以添加文件,但我想验证,所以添加的文件没有以任何人类已知的格式压缩,所以我没有希望人们能够添加一个zip文件或rar或7z或gz,等等。

任何人都可以帮我一个想法,这甚至有可能吗?

在此先感谢。

*编辑: 该程序由IT学生使用,它们添加源代码文件(.java,.class,.php,.doc,.mdb),路径保存为字符串,并在最后,程序将文件压缩并发送给教师,知道教师不想接收压缩或压缩文件,这就是验证的原因。

+0

请检查这个问题,似乎同样[http://stackoverflow.com/questions/4148987/checking-if -a-流是-A-zip文件] [1] [1]:http://stackoverflow.com/questions/4148987/checking-if-a-stream-is-a- zip文件 – bhatanant2

+0

添加文件到哪里?它是一个物理文件吗?你能检查文件的前几个字节,例如zip文件以PK – gigadot

+0

开头你的目的只是想让文本文件?你可以添加未压缩的二进制文件吗?检测压缩文件的通用方法是将其压缩并查看它是否更小。如果该文件是非中间文件但不小,它已被压缩。例如一个PNG文件被压缩。 –

回答

4

您基本上对该文件的字节执行unix命令type的java等效项。大多数文件都有一个嵌入式指纹,它为其他程序提供了关于它是什么类型文件的提示。这种指纹通常称为“幻数”

7zip - '7', 'z', 0xBC, 0xAF, 0x27, 0x1C 
gzip - 0x1F, 0x8B 

一个(不完整的)list of magic numbers can be found here

某些文件没有幻数,在这种情况下,您必须在文件中查找其他常见项目,强烈提示它是可疑类型的文件。

依靠文件扩展名只会让每个人最终重命名扩展名。

1

大多数压缩文件类型在开头都有一个“幻数”,几个字节表示文件的类型(不仅是压缩文件,也包括图像等)。您可以根据已知的文件类型检查文件内容。你可以谷歌“幻数文件类型”。

0

FWIW,此功能检查,如果一个文件被gzip压缩:

public static boolean isGzipped(File f) { 
    InputStream is = null; 
    try { 
     is = new FileInputStream(f); 
     byte [] signature = new byte[2]; 
     int nread = is.read(signature); //read the gzip signature 
     return nread == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b; 
    } catch (IOException e) { 
     Log.x(e); 
     return false; 
    } finally { 
     Closer.closeSilently(is); 
    } 
} 

See Closer.closeSilently() here.