Java中获得文件类型

有时候我们需要确定一个文件的实际类型.以下举例以图片格式为例.
最常见的就是根据文件的扩展名来判断类型了,比如扩展名是”jpg”我们认为他的类型是”image/jpeg”
等等.

如果是httpurl的文件我们还可以根据xxx.getContentType();(xxx.getPropertye(“Content-type”))来活得文件的类型;
如果是本地物理路径的文件也可以虚拟一个java.net.URL,然后根据URLConnection来获得文件的类型.

如果有人故意改变文件的扩展名呢?
如: a.jpg他就改成a.gif的呢?

显然根据扩展名判断肯定是错误的了,经过测试根据URL也一样是错误的.

对于在手机上应用,或者我们在做图片合成(在一个图片上追加一个图片或者文字)的时候,对于每一种图片的编码是不一样的,我们必须得到准确文件格式.

在网上找了很多资料,后来lhelper告诉我一个地址http://filext.com 在这里记录了目前决大部分常用文件的格式类型.截至到2004-07-15,FILExt 中已经有了16828 条记录;你甚至可以通过FILExt 的blog 向FILExt 的库中添加你所掌握的某种新型文件的相关信息。

下面是从FILExt 中查到的另外几种常见图片的文件(bmp、jpeg、png、tiff)标识信息。
—————————-
image/gif
image/x-xbitmap
image/gi_
Hex: 47 49 46 38
ASCII: GIF8
or for GIF87a…
Hex: 47 49 46 38 37 61
ASCII: GIF87a
or for GIF89a…
……………………….
Hex: 47 49 46 38 39 61
ASCII: GIF89a
—————————-

—————————-
image/jpeg
image/jpg
image/jp_
application/jpg
application/x-jpg
image/pjpeg
image/pipeg
image/vnd.swiftview-jpeg
image/x-xbitmap
……………………….
Hex: FF D8 FF
ASCII:
—————————-

—————————-
image/bmp
image/x-bmp
image/x-bitmap
image/x-xbitmap
image/x-win-bitmap
image/x-windows-bmp
image/ms-bmp
image/x-ms-bmp
application/bmp
application/x-bmp
application/x-win-bitmap
application/preview
……………………….
Hex: 42 4D
ASCII: BM
—————————-

—————————-
image/png
application/png
application/x-png
……………………….
Hex: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
ASCII: .PNG……..IHDR
—————————-

—————————-
image/tif
image/x-tif
image/tiff
image/x-tiff
application/tif
application/x-tif
application/tiff
application/x-tiff
……………………….
Hex: 49 49 2A 00
ASCII:
—————————-

用java读入一个文件然后判断他的前多少个byte是否符合某一类型的数值就可以判断出文件的真实类型.

唯一缺点就是效率比较低,因为他要把这个文件读一遍.

你可以根据你不同的需要,选择不同的判断方式.

分享到: 更多