みの屋.

プログラムを書いてる時に躓いたことやコードの進捗などをメモでまとめていく予定です.(ついでに日常のつぶやきもちらほらと……)

Javaでフォルダ以下のファイルを全部取ってみる

実は,この頃学校の講義や実験などでなにかとファイルにまとめられた大量の細かいデータを扱うことが増えてきました.

例えば,
f:id:Minoya:20171209184850p:plain:w200

という構造を持つファイルに対して.csvのファイルだけを全て検索,処理したい.
ということが増えました.

因みに,今は主にJavaPythonを使っているのですが,Pythonなら一瞬で全て検索できます.

import glob                                                                     
                                                                                
for name in glob.iglob('**/*.csv', recursive=True):                             
    print(name)

結果(Folder階層で検索した結果)↓

folder_A/1340_19832.csv
folder_A/214_20496.csv
folder_A/2310_13554.csv
folder_A/538_20593.csv
folder_A/945_20591.csv
folder_B/11_20062.csv
folder_B/9_20331.csv
folder_C/486_19918.csv
folder_C/494_19912.csv
folder_C/folderC_1/142_15207.csv
folder_C/folderC_1/21_15157.csv
folder_C/folderC_1/86_15241.csv

………たった3行で完璧に検索できました.
これもういっそ全部pythonでいいんじゃないか

…という考えは捨てて,もしかしたらpythonでなくjavaでやらないといけない場合が出るかもしれない…!!
ということで,javaでも同じことを実装するときにどこまで短く書けるのだろう,と思いjavaでも同じコードを書いてみました.

今回プログラムを組む際に主に用いたのがFileクラスです.
File クラスとはローカルディスクにあるファイルをJavaで扱えるようにしてくれるクラスのことです.

アルゴリズム

今回のプログラムのアルゴリズムは以下のようになります.

  • Fileクラスに指定Pathを渡してlistFile()を用いてファイル一覧を取得する
  • for文でリスト内を一つ一つフォルダかファイルかを判別し,フォルダだった場合はそのフォルダのパスを引数として再帰を行う
  • ファイルだった場合はさらにendsWith(指定したい拡張子)で分け,条件に合うならば出力

因みにファイルの拡張子関係なく指定ディレクトリ下全てのファイルを取得したい場合には上の3番目の処理を抜けばokです.
このアルゴリズムで出来上がったプログラムが以下になります.

import java.io.File;                                                            
//import java.io.FileNotFoundException;                                         
                                                                         
public class file_control{                                                      
    public static void main(String[] args){                                     
        String dir_path = "/Users/user_name/dir/path/";  //検索開始したいフォルダのPath(今回の場合なら`~Folder/`まで書く)
        String extension = ".csv";   //検索したいファイルの拡張子                      
        file_search(dir_path, extension);                                                  
    }                                                                           
    public static void file_search(String path, String extension){                                
        File dir = new File(path);                                              
        File files[] = dir.listFiles();                                         
        for(int i=0; i<files.length; i++){                                      
            String file_name = files[i].getName();                              
            if(files[i].isDirectory()){  //ディレクトリなら再帰を行う                                                                        
                file_search(path+"/"+file_name, extension);                                
            }else{  
                if(file_name.endsWith(extension)){  //file_nameの最後尾(拡張子)が指定のものならば出力                                 
                    System.out.println(path+"/"+file_name);
                }                                  
            }                                                                   
        }                                                                       
    }                                                                           
}                                                                               

一応24行に抑えましたが今の私にはこれが精一杯の短縮です……もっと知識があればもっと短くなりそう…………
……そして肝心の実行結果は,

folder_A/1340_19832.csv
folder_A/214_20496.csv
folder_A/2310_13554.csv
folder_A/538_20593.csv
folder_A/945_20591.csv
folder_B/11_20062.csv
folder_B/9_20331.csv
folder_C/486_19918.csv
folder_C/494_19912.csv
folder_C/folderC_1/142_15207.csv
folder_C/folderC_1/21_15157.csv
folder_C/folderC_1/86_15241.csv

よかった.ちゃんと正しく出力できました.

………もっと色んなコード書いてプログラム書く力つけていきたいなぁ