我想检查我从目录中读取的文件是否是jpg,但我不想只是检查扩展名。我在想另一种方法是阅读标题。我做了一些研究,我想用
ImageIO.read
我见过这个例子
String directory="/directory";
BufferedImage img = null;
try {
img = ImageIO.read(new File(directory));
} catch (IOException e) {
//it is not a jpg file
}
我不知道从哪里开始,它会占用整个目录...但我需要目录中的每个jpg文件。有人能告诉我我的代码有什么问题或需要添加什么内容吗?
谢谢!
答案 0 :(得分:6)
您可以读取存储在缓冲图像中的第一个字节。这将为您提供确切的文件类型
Example for GIF it will be
GIF87a or GIF89a
For JPEG
image files begin with FF D8 and end with FF D9
http://en.wikipedia.org/wiki/Magic_number_(programming)
试试这个
Boolean status = isJPEG(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"));
System.out.println("Status: " + status);
private static Boolean isJPEG(File filename) throws Exception {
DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
try {
if (ins.readInt() == 0xffd8ffe0) {
return true;
} else {
return false;
}
} finally {
ins.close();
}
}
答案 1 :(得分:3)
您需要让读者习惯阅读格式并检查给定文件没有可用的读者...
String fileName = "Your image file to be read";
ImageInputStream iis = ImageIO.createImageInputStream(new File(fileName ));
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpg");
boolean canRead = false;
while (readers.hasNext()) {
try {
ImageReader reader = readers.next();
reader.setInput(iis);
reader.read(0);
canRead = true;
break;
} catch (IOException exp) {
}
}
现在基本上,如果没有读者可以阅读该文件,那么它不是Jpeg
<强>买者强>
仅当有可用于给定文件格式的阅读器时,此功能才有效。它可能仍然是一个Jpeg,但没有读者可用于给定的格式......
答案 2 :(得分:0)
改进@karthick 给出的答案,您可以执行以下操作:
private static Boolean isJPEG(File filename) throws IOException {
try (DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)))) {
return ins.readInt() == 0xffd8ffe0;
}
}