如何判断某个文件是否为二进制文件,用Java代码来实现

如题所述

转个过来,每种类型的文件前几个字节固定,可以根据头部几个字节判断文件格式

图片的格式很多,一个图片文件的后缀名并不能说明这个图片的真正格式什么,那么如何获取图片的格式呢?我想到了几个简单但有效的方法,那就是读取图片文件的文件头标识。我们知道各种格式的图片的文件头标识识不同的,因此我们可以通过判断文件头的标识来识别图片格式。

我对各种格式的图片文件头标识进行了分析,不仅查找资料,也用十六进制编辑器察看过图片的文件头,以下是我收集、分析的结果,供大家参考。
1.JPEG/JPG
-
文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识)
- 文件结束标识 (2 bytes): $ff, $d9
(EOI)
2.TGA
- 未压缩的前5字节 00 00 02 00 00
- RLE压缩的前5字节 00 00
10 00
00
3.PNG
- 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A
0A
4.GIF
-
文件头标识 (6 bytes) 47 49 46 38 39(37)
61
G I F 8 9
(7) a
5.BMP
- 文件头标识
(2 bytes) 42 4D
B
M
6.PCX
- 文件头标识 (1
bytes) 0A
7.TIFF
- 文件头标识 (2 bytes)
4D 4D 或 49
49
8.ICO
- 文件头标识 (8 bytes) 00 00 01 00 01 00 20 20
9.CUR
- 文件头标识 (8 bytes) 00 00 02 00 01 00 20
20
10.IFF
-
文件头标识 (4 bytes) 46 4F 52
4D

F O R M
11.ANI
- 文件头标识 (4 bytes)
52 49 46
46
R I F F

根据这些文件头标识的收集,我可以写一个识别图像格式的模块了。但是在写这个模块之前可以对收集到的文件头标识进行优化,使得程序中字符串比对次数尽量的少。
1.JPEG我们知需要比对文件头的$ff,
$d8这两个字符,而不用读取最后的两个结束标识了。
2.TGA,ICO,CUR只需比对第三个与第五个字符即可。
3.PNG比对[89][50]这两个字符。
4.GIF比对[47][49][46]与第五个字符。
废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件是什么类型的文件,例如
jpg文件
是 FFD8 (从低位到高位就要反过来 D8FF 下面都是一样)
BMP文件 是 424D
---4D42
其他的我就不一一列举了,想知道跟多文件类型分别是用什么字符作为文件的开头的话,下载个C32asm或者UE等这类16进制编辑器就可以看到了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-23
很多文件是带有文件头的, 文件头不一定是文本格式, 如果你要把这样的文件排除在你所认为的“二进制文件”之外,就需要单独地识别每一类型的文件头。
linux 系统中有个 file 命令,可以识别不同的文件类型, 建议你下载这个文件的源代码参考一下本回答被网友采纳
第2个回答  2012-08-21
任何文件都是以二进制形式存在硬盘的. 都是二进制追问

不是还有纯ASCII码的文件吗?我的意思其实是说,在linux下,怎样通过java代码,来判断系统的文件

怎么把这种文件给区分开?通过java编程

追答

有一种是跟展扩名 来区分这种比简单 比如XXX.txt 这个种就是文本文件了
如果没有的话就只有用文件头来区分 以16进制读取 判断文件头就行
你找个16进制查看工具 查看一下你就明白了

追问

我看了以后还是不知道怎么通过java编程来区分开,linux下的系统文件啊?

如何判断某个文件是否为二进制文件,用Java代码来实现
1.JPEG我们知需要比对文件头的$ff,d8这两个字符,而不用读取最后的两个结束标识了。2.TGA,ICO,CUR只需比对第三个与第五个字符即可。3.PNG比对[89][50]这两个字符。4.GIF比对[47][49][46]与第五个字符。废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的...

使用java编程如何判断文件夹下的文件是二进制文件还是文本文件
同方法1一样,无法对中文字符进行有效的判断,一个全为中文的文本文件,肯定会被认定为二进制文件。5、严格对比法。逐字节读取,然后满足以下任何一个条件那么就是二进制文件:1)所读取字节大于127并且小于160;2)所读取字节大于等于160并且不成对出现;(注:大于等于160并成对出现的是汉字,其他UNICOD...

java 怎么判断一个文件的类型,比如说是txt,jpg,xls,exe,等等,说后缀名...
回答:二进制与二进制本身没什么区别,区别在于文件结构,常见的图片、xls等等都是有相对固定的文件结构的,比如说总是以哪几个字节开始,后面跟的是什么数据,数据有多长等等。要判断文件类型,一般常用的方法是也是基于这个原理,通过文件前面的固定字节来判断,java也不例外,百度搜索一下 java 文件 类型 判断,...

如何判断文件是文本还是二进制求解答
判断是否存在控制字符:这个也靠谱,但是难度比较大,因为有些Unicode文件在开头放了控制字符,所以必须处理这种特殊情况。(我记得有些编辑器就是这样判断文件是否为二进制的)这些答案都算靠谱,也有不靠谱的。居然有人回答:文本终究也是二进制的,所以你没办法判断!NND,这就好像说:Women 本质上就是 ...

...里面的内容格式我现在知道。我想用java来解析出来。
换UTF-8试试。要不就是你解析有误。dat可能不是一个文本文件。你这种读byte的方法恐怕有误

java byte数组写入本地文件,那这个文件是二进制文件吗?不是的话,是...
byte是十进制的数字。。给你看个例子:public class Test { public static void main(String[] args) { String str = "b";byte[] bytes = str.getBytes();for(byte b:bytes){ System.out.println(b);System.out.println(Integer.toBinaryString(b));} } } ...

Java读取文件内容(Java读取文件内容为字符串)
JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代码,需要的可以直接复制使用 publicclassReadFromFile{ \/** *以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。 *\/ publicstaticvoidreadFileByByt...

java怎么实现读取一个文件,拿到二进制流
Java读取二进制文件,以字节为单位进行读取,还可读取图片、音乐文件、视频文件等,在Java中,提供了四种类来对文件进行操作,分别是InputStream OutputStream Reader Writer ,前两种是对字节流的操作,后两种则是对字符流的操作。示例代码如下:public static void readFileByBytes(String fileName)...

跪求“java中二进制怎么表示”
一、二进制的表示方法 有0,1组成。以0b开头。代码的表示方法:System.out.println(0b100)二、不同进制的数据表现:八进制:由0,1,...,7.以0开头。十进制:由0,1...,9.默认整数。十六进制:由0,1,...9,a,b,c,d,e,f(大小写均可)组成。十进制:System.out.println(100);八进...

Java怎么解析用C写入的.bin类型二进制文件
Java怎么解析用C写入的.bin类型二进制文件 \\\\假设文件的地址为a.txt FileInputStream in=new FileInputStream(new File("a.txt"));byte[] buffer=new byte[4096];int offset=0;while((offset=in.read(buffer)>-1){ \/\/这已经把文件读入到buffer中了,范围为0到offset,你可以做任何处理了 } ...

相似回答