我想验证目录中的所有文件是否属于某种类型。到目前为止我做的是。
private static final String[] IMAGE_EXTS = { "jpg", "jpeg" };
private void validateFolderPath(String folderPath, final String[] ext) {
File dir = new File(folderPath);
int totalFiles = dir.listFiles().length;
// Filter the files with JPEG or JPG extensions.
File[] matchingFiles = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(ext[0])
|| pathname.getName().endsWith(ext[1]);
}
});
// Check if all the files have JPEG or JPG extensions
// Terminate if validation fails.
if (matchingFiles.length != totalFiles) {
System.out.println("All the tiles should be of type " + ext[0]
+ " or " + ext[1]);
System.exit(0);
} else {
return;
}
}
如果文件名的扩展名为{file.jpeg,file.jpg},则此方法可以正常工作 如果文件没有扩展名{file1 file2},则会失败。 当我在终端上执行以下操作时,我得到:
$ file folder/file1
folder/file1: JPEG image data, JFIF standard 1.01
更新1:
我试图获取文件的幻数以检查它是否为JPEG:
for (int i = 0; i < totalFiles; i++) {
DataInputStream input = new DataInputStream(
new BufferedInputStream(new FileInputStream(
dir.listFiles()[i])));
if (input.readInt() == 0xffd8ffe0) {
isJPEGFlag = true;
} else {
isJPEGFlag = false;
try {
input.close();
} catch (IOException ignore) {
}
System.out.println("File not JPEG");
System.exit(0);
}
}
我遇到了另一个问题。我的文件夹中有一些 .DS_Store 文件。 知道怎么忽略它们吗?
答案 0 :(得分:3)
首先,文件扩展名不是必需的,没有扩展名的文件很可能是有效的JPEG文件。
检查RFC是否为JPEG格式,文件格式通常以一些固定的字节序列开头,以识别文件的格式。这绝对不是直截了当的,但我不确定是否有更好的方法。
简而言之,您必须打开每个文件,根据文件格式读取前n个字节,检查它们是否与您期望的文件格式匹配。如果他们这样做,即使它有exe扩展名,或者即使它没有任何扩展名,也是一个有效的JPEG文件。
答案 1 :(得分:2)
对于JPEG,您可以在文件的标题中执行幻数检查:
static bool HasJpegHeader(string filename)
{
using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
{
UInt16 soi = br.ReadUInt16();
UInt16 jfif = br.ReadUInt16();
return soi == 0xd8ff && jfif == 0xe0ff;
}
}
此处包含EXIFF的更完整方法:C# How can I test a file is a jpeg?
答案 2 :(得分:2)
一个好的(虽然很昂贵)检查有效性,因为J2SE理解的图像是尝试ImageIO.read(File)
它。如果它没有在提供的文件中找到图像,那么这些方法会引发一些非常有用的异常。