2006-12-13
java中如何判断一个文件是二进制文件还是文本文件?
现在的做法是把文件读进来,逐个解析每一个byte,如果有一个byte<0那么断定这个文件是二进制的,这在纯英文的环境下可以工作,但是如果一个文本包含了中文字符,那么这个文件也会被判断为二进制文件。
我在网上看看到有人也是逐个比较每一个byte,只不过是如果有一个byte=0就判断为二进制文件,这样做有依据吗?
大家有没有什么解决办法?
我在网上看看到有人也是逐个比较每一个byte,只不过是如果有一个byte=0就判断为二进制文件,这样做有依据吗?
大家有没有什么解决办法?
- 12:27
- 浏览 (5244)
- 论坛浏览 (5227)
- 评论 (16)
- 分类: 技术天地
- 相关推荐
评论
lijiangt 写道
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。
试了一下file命令,果然能分出绝大多数的文件类型,找源码来看过后再发表意见,我判断是否试文本文件的目的是文本比较,在比较两个文件之前先判断是否是文本文件,如果不是就不比较了,判断后缀名能够满足大部分需求,但是维护已知文件后缀总是觉得不是完全之策,比如再unix下有的文件根本没有后缀也是文本文件,这样岂不是就有了漏网之鱼
仅仅判断前两位不够,我检查过各种执行文件,头两行都是:
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格式文本换行)
投新手贴的人确实太不厚道。
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格式文本换行)
投新手贴的人确实太不厚道。
要检查是否可执行文件/动态连接库,检查头是否: 4D 5A
检查是否JPG,头文件是否:FF D8 FF E0
每种格式的头文件都是固定的,搂住说“二进制”是有问题的,我估计搂住想问的是:如何判断是否可执行文件?
检查是否JPG,头文件是否:FF D8 FF E0
每种格式的头文件都是固定的,搂住说“二进制”是有问题的,我估计搂住想问的是:如何判断是否可执行文件?
lijiangt 写道
在linux或者unix系统用file命令就可以打印文件的类型,估计是读取文件头部信息,楼主可以去看看file源代码,应该有所收获。
嗯,这个回复是最靠边的,不错。
可不可以这么说,用文本编辑器(如记事本)能正常编辑的,就是文本文件。
together 写道
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
你这只能检查出\0字符。
together 写道
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
恩,这倒是一个方法,可以不用全读,只读1024字节,然后存成String,写入tmp文件,在判断新旧是否一样大
投新手的19票,差不多是一个资深会员的。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
简单一点的通过后缀名就可以判断。再深入一点,可以以文本方式打开文件,存为string,再写入新文件,如果新旧文件的大小一样,应该就是文本文件了。否则就是二进制文件。
在英文环境下还是很简单的,判断每个byte的值,如果不是byte的值不是在32-127之间,同时又不是回车或换行的化,就认为它是二进值的就可以,但是如果又英文字符,就很难判断了
xly_971223
2006-12-13
回复
个人认为这个很难 都是二进制数据 如果没有人告诉你是文本或者二进制 那根本无法知道这个二进制数据到底是什么意义?
就像 告诉你01010001 问这是什么意思? 谁也不能准确回答
就像 告诉你01010001 问这是什么意思? 谁也不能准确回答
Ivan Li 写道
文件比较,如果是二进制的就不比较了
具体做什么功能的,版本控制系统?
系统给个默认的文本文件后缀名列表,比如txt, xml, jsp等等,不在这个列表上的统一认为二进制,当然用户可以根据实际需求添加修改这个列表。
发表评论
该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子
最新评论
-
使用ubuntu作为工作桌面详 ...
Oracle的Oracle SQLDeveloper可以用也可以把windowz ...
-- by zhoun -
使用ubuntu作为工作桌面详 ...
Ivan Li 写道moonjava 写道一些数据库的客户端呢? Oracle可 ...
-- by moonjava -
使用ubuntu作为工作桌面详 ...
moonjava 写道一些数据库的客户端呢? Oracle可以用Oracle S ...
-- by Ivan Li -
使用ubuntu作为工作桌面详 ...
写得不错!只是觉得linux下顺手的软件太少
-- by vdgame -
使用ubuntu作为工作桌面详 ...
一些数据库的客户端呢?
-- by moonjava







评论排行榜