Javaでフォルダ以下のファイルを全部取ってみる
実は,この頃学校の講義や実験などでなにかとファイルにまとめられた大量の細かいデータを扱うことが増えてきました.
例えば,
という構造を持つファイルに対して.csv
のファイルだけを全て検索,処理したい.
ということが増えました.
因みに,今は主にJavaとPythonを使っているのですが,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
よかった.ちゃんと正しく出力できました.
………もっと色んなコード書いてプログラム書く力つけていきたいなぁ