检查文件是否属于某种类型

问题描述:

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

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}扩展 如果文件没有扩展名{文件1文件2}这个失败。 当我在我的终端下,我得到:

$ 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文件。 任何想法如何忽略它们?

+3

你的意思是如何验证没有扩展名的文件是否是JPEG文件? –

+0

是的你是对的! –

+0

仅仅因为文件名以特定扩展名结尾并不意味着该文件的_content_对应于其名称。您需要阅读文件的内容(至少前N个字节) - 这就是'文件'命令的作用... –

首先,文件扩展名不是必需的,没有扩展名的文件可能是一个有效的JPEG文件。

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

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

+0

我做了一些更新。你能告诉我,如果我以正确的方式进行? –

为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?

+0

JPEG是否有正式的标题?你的方法很有趣,但不确定它是否适用于JPEGS。 –

+0

为了成为一个有效的JPEG,他们将这些在他们的头... – emalamisura

+0

我做了一些更新。你能告诉我,如果我以正确的方式进行? –

一个很好的(虽然昂贵)检查有效性作为J2SE可以理解的图像就是试试ImageIO.read(File)吧。如果在提供的文件中找不到图像,该方法会引发一些相当有用的例外。

+0

我做了一些更新。你能告诉我,如果我以正确的方式进行? –