我知道,我很偏执,这会被标记为DUPLICATE
然而,我陷入了一些我无法解决的问题,所以我需要你的帮助。
基本上我抽象了从Image(任意)读取前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个字节,很少没有(突出显示)。
输出:
如果我在某个地方出错,请告诉我!感谢。
答案 0 :(得分:2)
我发现了问题。谢谢 gyan 我已经对自己感到愚蠢了。 我需要做的就是更改为检查字节的十六进制代码而不是小数。 正如http://www.garykessler.net/library/file_sigs.html
中所述修复很简单 - sb.append(String.format(“%02X”,b));
for (int k = 0; k < l; k++)
{
byte b = abyte0[k];
if (count == 8L)
break;
//System.out.println(file.getName()+" "+b);
//sb.append(b);
sb.append(String.format("%02X ", b));
//System.out.printf("0x%x ", b);
count++;
}
并按如下方式进行测试
if(sb.toString().startsWith("FF D8 FF"))
System.out.println(file.getName() +" is JPG ");
else if(sb.toString().startsWith("47 49 46 38 37 61") || sb.toString().startsWith("47 49 46 38 39 61"))
System.out.println(file.getName() +" is GIF ");
else if(sb.toString().startsWith("89 50 4E 47 0D 0A 1A 0A"))
System.out.println(file.getName() +" is PNG ");
输出:
答案 1 :(得分:1)
你可能会对文件名的扩展感到困惑吗?
试试这个,只需将* .png的名称更改为* .jpeg并使用任何图像编辑器/查看器打开;它不应该抱怨格式不被识别。这可能是您获得相同8字节的原因,即使扩展名不同。
因为我观察到许多程序不会抱怨更改图像文件扩展名,只要他们可以处理文件并在他们的窗口中显示。
编辑:请使用以下代码并发布输出:
import java.io.*;
import java.net.*;
public class ReadBytes {
public static void main( String [] args ) throws IOException {
URL url = new URL("http://your image url");
// Read the image ...
InputStream inputStream = url.openStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte [] buffer = new byte[ 1024 ];
int n = 0;
while (-1 != (n = inputStream.read(buffer))) {
output.write(buffer, 0, n);
}
inputStream.close();
// Here's the content of the image...
byte [] data = output.toByteArray();
// Write it to a file just to compare...
OutputStream out = new FileOutputStream("data.png");
out.write( data );
out.close();
// Print it to stdout
for( byte b : data ) {
System.out.printf("0x%x ", b);
}
}
}