Java-根据二进制文件头来判断文件类型的实现机制是什么呢?
如何根据 二进制文件头来来得到文件的类型,类似 linux下的 file 命令,其实现机制是什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何根据 二进制文件头来来得到文件的类型,类似 linux下的 file 命令,其实现机制是什么呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
Linux判断文件类型优先采用的是Magic Number,一般是文件开头的一些信息。不同的文件类型通常具有不同的特征文件开头,比如BMP图片文件以BM两个字符开头,RIFF格式文件会有RIFF四字节码标记的等。
您说需要的库我不是很清楚,但是这部分内容完全可以自行检测,也就是读取文件开头或者结尾部分(有的magic字段的确是在结尾部分的)数据,进行比较。
有篇博文:php代码实现读取文件头判断文件类型,支持图片、rar、exe等后缀
很简单,看下文件头就知道了。比如你用十六进制编辑器打开一张JPG图片,最后两个字节一定是
FF D9。不信你试试。
如果你是JAVA程序员的话,你应该知道CLASS文件的魔法数字“咖啡宝贝”!
文件头中包含文件类型标识,通过这个标识来识别文件类型。在linux中,文件头开始的前2个字节值就是文件类型标识型,可以man一下file命令的详细解释。
这是Linux手册上对File命令分析文件过程的说明:(看这个应该是最官方的解释了)
File 命令试图检查每个参数以判定文件的类型. 检查共有三组,按如下顺序进行:文件系统检查,幻数检查,以及语言检查.
文件系统 检查成功则输出文件类型.
输出的类型一般会包含以下的词中的一个: text (文件中仅有 ASCII 字符,可以用 ASCII 终端读此文件,以保证内容的可靠性), executable (文件中保存的是程序编译后的结果,一些UNIX 内核或其它内核能理解这类文件), 或者 data 表示所有其它类型文件(data 一般为二进制文件或者不可打印的). 但是有的常用的文件格式(如core文件、tar包),虽然也包含二进制数据,却不属于这一类如果要修改 /usr/share/magic 或者程序本身, preserve these keywords . 当文件为
text'' 类型时,认为此文件为可读文件. 不要象在Berkeley环境中那样做 - 要把
shell commands text''改为``shell script''.文件系统检查是建立在对 stat(2) 系统调用结果的分析上的. 程序会分析文件是否为空,或者是否是某种特殊文件. 对于所有可在现有系统上使用的文件类型 (比如套接口文件,动态链接文件,命名管道文件(FIFOs) 等),只要它在系统头文件 sys/stat.h 中已经定义过,就可以被检查到.
幻数检查用来检查文件中是否有特殊的固定格式的数据. 规范的例子如二进制可执行文件(编译后的程序) a.out ,该文件格式在标准include目录下的 a.out.h 文件中定义,也可能在 exec.h 中定义. 这些文件在文件开始部分附近的一个特殊位置保存有一个'幻数' , 通过幻数告诉UNIX 操作系统此文件是二进制可执行文件, 和其中包含的其它类型. 幻数的概念已经扩展到数据文件.任何在文件固定位置有与文件类型相关的不变标识符的文件都可以这样表示. 这些文件中的信息可以从幻数文件 /usr/share/magic 中读取.
如果文件为 ASCII 文件, file 会试图检查它的语言. 语言检查在文件开始的几个块中(任意位置)查找是否有特殊字符串(参看 names.h) .br 指出此文件很可能是 troff(1) 输入文件, 而关键字 struct 指出此文件是C程序. 语言检查不如前两组检查可靠,所以放在最后执行.它也用来检查一些混合文件(例如 tar(1) 存档文件)并确定文件是
ascii text'类型还是
data'类型.