5

我想验证目录中的所有文件是否都属于某种类型。到目前为止我所做的是。

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文件。知道如何忽略它们吗?

4

3 回答 3

3

首先,文件扩展名不是强制性的,没有扩展名的文件很可能是有效的 JPEG 文件。

检查 JPEG 格式的 RFC,文件格式通常以一些固定的字节序列开头,以识别文件的格式。这绝对不是直截了当的,但我不确定是否有更好的方法。

简而言之,您必须打开每个文件,根据文件格式读取前 n 个字节,检查它们是否与您期望的文件格式匹配。如果他们这样做,即使它具有 exe 扩展名或即使它没有任何扩展名,它也是一个有效的 JPEG 文件。

于 2012-10-11T18:05:34.900 回答
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?

于 2012-10-11T18:08:18.280 回答
2

对 J2SE 理解的图像的有效性进行的一种很好的(虽然昂贵的)检查是尝试ImageIO.read(File)它。如果在提供的文件中找不到图像,该方法会引发一些非常有用的异常。

于 2012-10-11T18:39:32.143 回答