我知道并且我很偏执,这将被标记为DUPLICATE
但是我被困在我自己无法解决的事情上,所以我需要你的帮助。
基本上我抽象了从 Image(any) 读取前 8 个字节的概念,并根据它决定它是否属于任何类型 (PNG,JPEG,GIF) 。
我正在尝试在Java 中实现这一点。
package examples;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
import org.apache.commons.io.IOUtils;
public class BlobCheck
{
public static void main(String args[]) throws Exception
{
File dir = new File(args[0]);
File files[] = dir.listFiles();// Here this files will be changed to
// Blobs from database and then i will
// convert each blob to bytes.
StringBuffer sb = new StringBuffer();
StringBuilder chars = new StringBuilder();
File afile[];
int j = (afile = files).length;
for (int i = 0; i < j; i++)
{
File file = afile[i];
FileInputStream fis = new FileInputStream(file);
byte bytearr[] = IOUtils.toByteArray(fis);
long count = 0L;
byte abyte0[];
int l = (abyte0 = bytearr).length;
for (int k = 0; k < l; k++)
{
byte b = abyte0[k];
if (count == 8L)
break;
sb.append(b);
chars.append((char) b);
count++;
}
// if ("-1-40-1-320167470".equals(sb.toString()))
/*
* if ("-1-40-1".equals(sb.toString())) System.out.println((new
* StringBuilder
* (String.valueOf(file.getName()))).append(" is an image file ")
* .append
* (sb.toString()).append(" ").append(chars.toString()).toString());
* else
*/
System.out.println((new StringBuilder(String.valueOf(file.getName()))).append(" ").append(sb.toString()));
sb.delete(0, sb.length());
chars.delete(0, chars.length());
}
}
}
现在,我用一堆不同类型的文件(图像、文档、xls 等)填充一个文件夹并执行我得到以下输出的类。
在这里,前 8 个字节(十进制)值与 DUPLICATE(上图)中给出的值不同。令人惊讶的是,大多数图像都具有相同的 8 个字节,而很少有(突出显示)。
输出:
- 2.jpg -1-40-1-320167470
- 2g.gif -1-40-1-320167470
- 324.png -1-40-1-320167470
- 4.jpg -1-40-1-320167470
- 6.jpg -1-40-1-320167470
- 9.jpg -1-40-1-320167470
- 标志.jpg -1-40-1-1801465100
- Lpng.png -1-40-1-1801465100
- 图片.xls -48-4917-32-95-7926-31
- Thumbs.db -48-4917-32-95-7926-31
如果我在某个地方出错了,请告诉我!谢谢。