2012-04-18 9 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()メソッドを使用すると、比較する前に名前を正確にする。

更新(コメントに基づいて):より多くのOOPソリューションでは、java.io.FilenameFilterインターフェイスを実装し、そのインスタンスをf.listFiles()に渡すことができます。これにより、コードを繰り返し実行することなく、プログラムの別の部分でそのフィルタを再利用できます。 。あなたがこのアプローチを使用する場合は、あなたがFilenameFilter実装

+0

感謝を得ることができ、私は他の部分を継続することができます。 。助けをもう一度感謝.. – Eric

+3

技術的に正しい間に、私はこの解決策に同意する必要があります。 'java.io.FilenameFilter'の実装を使って、 'File.listFiles(FilenameFilter)'メソッドに渡して、パターンにマッチするファイルだけを返すようにします(または 'String.endsWith(String)'を使用します)。この解決策は、OOではなく手続き型コードの匂いがする。 –

+0

@JohnGaughan - OPのコードに基づいて、これは望ましい結果を得るためにそれを変更する最も簡単な方法のようでした。 – Attila

1

必要なのは、各拡張子のファイル数を格納するために使用できるデータ構造です。 Map<String /*extension*/, Integer /*count*/>が良い選択でしょう。

ファイルごとに、その名前に最後の.の後のすべての拡張子を最初に決定します。次に、マップにその拡張機能のエントリがあるかどうかを確認します。それが存在する場合は1だけインクリメントし、カウント1の新しいエントリを作成しない場合は

もちろん、これは拡張子ごとのファイル数を示し、ほとんど不可能な画像ファイルがあります。

1

endsWithロジックを移動する必要があり、以下の方法を使用すると、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

+0

@Attilaは計算しません、それは詳細なチェックMIMEタイプです。あなたは見えませんか?拡張は単独では何も意味しません。 – axcdnt

+0

この方法で、彼はそれが本当にイメージなのかどうかを調べることができます。 – axcdnt

4

File.listFiles(FilenameFilter)のような方法を参照してください。 FilenameFilterが作成され、あなたがFileとして親ディレクトリを持っているされた後、カウントはそれは驚くほど動作します..使用して助けを

int filesOfInterest = parentDir.listFiles(textAndJpegFilenameFilter).length; 
関連する問題