论坛首页 入门技术论坛

java中如何判断一个文件是二进制文件还是文本文件?

浏览 12792 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-12-13  
together 写道
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。

恩,这倒是一个方法,可以不用全读,只读1024字节,然后存成String,写入tmp文件,在判断新旧是否一样大
0 请登录后投票
   发表时间:2006-12-13  
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。
0 请登录后投票
   发表时间:2006-12-14  
together 写道
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。

你这只能检查出\0字符。
0 请登录后投票
   发表时间:2006-12-14  
lijiangt 写道
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。

嗯,这个回复是最靠边的,不错。
可不可以这么说,用文本编辑器(如记事本)能正常编辑的,就是文本文件。
0 请登录后投票
   发表时间:2006-12-14  
要检查是否可执行文件/动态连接库,检查头是否: 4D 5A
检查是否JPG,头文件是否:FF D8 FF E0
每种格式的头文件都是固定的,搂住说“二进制”是有问题的,我估计搂住想问的是:如何判断是否可执行文件?
0 请登录后投票
   发表时间:2006-12-14  
仅仅判断前两位不够,我检查过各种执行文件,头两行都是:
4D 5A 90 00 03 00 00 00 04  00 00  00 FF FF 00 00 B8 ***
但是如forxmail,EDiary 则是4D 5A 50,这个是有规律的,可仔细探索下。
4D 5A 90是MZ格式,4D 5A 50大家叫他MZP. -----  这个说法针对win有效,对unix,linux无效

别人的贴看到的另一种判断法(我没证实是否有效):
逐字节读取,然后满足以下任何一个条件那么就是二进制文件:
1、所读取字节大于127并且小于160;
2、所读取字节大于等于160并且不成对出现;(注:大于等于160并成对出现的是汉字,其他UNICODE字符集编码格式不是很清楚)
3、所读取字节小于32并且不等于9(TAB)、10(换行) (注: 10 是UNIX格式文本换行)
4、所读取字节小于32并且等于13(回车)但是之后的字节并不是10(换行) (注:13 10 是DOS格式文本换行)



投新手贴的人确实太不厚道。
0 请登录后投票
   发表时间:2006-12-14  
lijiangt 写道
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。

试了一下file命令,果然能分出绝大多数的文件类型,找源码来看过后再发表意见,我判断是否试文本文件的目的是文本比较,在比较两个文件之前先判断是否是文本文件,如果不是就不比较了,判断后缀名能够满足大部分需求,但是维护已知文件后缀总是觉得不是完全之策,比如再unix下有的文件根本没有后缀也是文本文件,这样岂不是就有了漏网之鱼
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics