4

我想计算一个目录中有多少图像。我有一些来自互联网的代码副本,可以检测目录中的总文件。

import java.io.*;

public class CountFilesInDirectory {
      public static void main(String[] args) {
            File f = new File("/home/pc3/Documents/ffmpeg_temp/");
            int count = 0;
            for (File file : f.listFiles()) {
                    if (file.isFile()) {
                            count++;
                    }
            }
            System.out.println("Number of files: " + count);
    }
}

我想计算一个特定的文件类型,比如 jpg/txt。我该怎么办?

4

4 回答 4

6

改变这个

if (file.isFile()) { 
  count++; 
} 

if (file.isFile() &&
    (file.getName().endsWith(".txt") || file.getName().endsWith(".jpg"))) { 
  count++; 
} 

这段代码所做的不仅仅是检查由 表示的实体是否file实际上是一个文件(而不是一个目录),您还检查它的名称是否以您正在寻找的特定扩展名结尾

注意:您可以使用 String.toLowerCase() 方法在比较之前将名称转换为更准确。

更新(基于注释):对于更多 OOP 解决方案,您可以实现java.io.FilenameFilter接口并将其实例传递给f.listFiles()- 从而使您能够在程序的另一部分重用该过滤器而无需太多代码重复。如果使用这种方法,则需要将endsWith逻辑移动到FilenameFilter实现中

于 2012-04-18T01:30:57.320 回答
4

请参阅类似的方法File.listFiles(FilenameFilter)。一旦FilenameFilter创建了 并且您将父目录设置为File,就可以使用 .. 获取计数。

int filesOfInterest = parentDir.listFiles(textAndJpegFilenameFilter).length;
于 2012-04-18T04:51:28.527 回答
1

您需要的是一种数据结构,可用于存储每个扩展名的文件数。Map<String /*extension*/, Integer /*count*/>将是一个不错的选择。

对于每个文件,您首先将其扩展名确定.为其名称中最后一个之后的所有内容。然后检查地图是否有该扩展名的条目。如果存在,则将其加一,如果不存在,则创建一个计数为 1 的新条目。

当然,这将告诉您每个扩展名的文件数,要查找图像数,您需要知道哪些扩展名将具有图像文件,这几乎是不可能的。

于 2012-04-18T01:30:55.573 回答
1

下面的方法是检查 MIME 类型的方法:

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);

查看这篇文章了解更多详情:Getting A File's Mime Type In Java

即使不是所有类型的文件都有所有 MIME 类型,我认为它会解决您的问题。 这样,您可以确保它是图像并继续计数。

希望能帮助到你!=D

于 2012-04-18T01:32:55.213 回答