2012-04-18 67 views
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。我該怎麼辦?

回答

5

更改此

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

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

這段代碼的作用是不是隻是檢查由file表示的實體是否實際上是一個文件(而不是目錄),你是還要檢查它的名稱是否以您正在尋找的特定擴展名結尾

注意:您可以使用String.toLowerCase()方法將比較前的名稱更準確。

更新(基於評論):一個更面向對象的解決方案,可以實現java.io.FilenameFilter接口和傳遞者的一個實例來f.listFiles() - 從而使您能夠重用方案的另一部分是過濾器沒有太多的代碼重複。如果你使用這種方法,你需要將endsWith邏輯移動到FilenameFilter實施

+0

感謝您的幫助..它工作得非常,我可以與其他部分繼續。 。再次感謝您的幫助。 – Eric 2012-04-18 01:44:03

+3

儘管技術上正確,但我不同意這種解決方案。我將使用'java.io.FilenameFilter'的實現並將它傳遞給'File.listFiles(FilenameFilter)'方法,以僅返回與Pattern匹配的文件(或者使用'String.endsWith(String)')。這個解決方案嗅到程序代碼,而不是OO。 – 2012-04-18 02:39:09

+0

@JohnGaughan - 基於OP的代碼,這似乎是修改它以獲得預期結果的最簡單方法 – Attila 2012-04-18 02:41:06

1

您需要的是一種數據結構,您可以使用它來存儲每個擴展的文件數量。 Map<String /*extension*/, Integer /*count*/>將是一個不錯的選擇。

對於每個文件,您將首先確定其擴展名,作爲名稱中最後一個.之後的所有內容。然後檢查地圖是否有該擴展程序的條目。如果它在那裏,增加一個,如果不是創建一個新的條目與計數1.

當然,這將告訴你每個擴展名的文件數量,找到你需要知道哪些擴展將需要計數的圖像有圖像文件,這幾乎是不可能的。

1

下面的方法是如何檢查的MIME類型:

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

檢查這個職位的詳細信息:Getting A File's Mime Type In Java

即使沒有所有類型的文件的所有MIME類型,我認爲它會解決您的問題。 這樣你可以確保它是一個圖像,並繼續計數。

希望它有幫助! = D

+0

OP要計算文件(特定模式),而不是caclulate mime類型 – Attila 2012-04-18 01:34:20

+0

@Attila不計算,它是詳細檢查MIME類型。你看不到嗎?本身擴展意味着什麼。 – axcdnt 2012-04-18 01:35:29

+0

這樣他可以檢查它是否真的是一個圖像,因此計數。 – axcdnt 2012-04-18 01:36:16

4

查看類似File.listFiles(FilenameFilter)的方法。一旦FilenameFilter已經創建,你有父目錄爲File,可以使用所獲得的計..

int filesOfInterest = parentDir.listFiles(textAndJpegFilenameFilter).length;