MY-NOTEBOOK

Saturday, March 25, 2006

java.io.Fileの配列を日付でソートする方法

LinuxにしてもWindowsにしてもファイルの日付(作成日、更新日)は、OSが管理していて取得できるのだが、java.io.Fileでは、getCreateCalendar(),getUpdateCalendar()とかいったメソッドは用意されていない。

いままで、java.io.Fileでは日付情報を取得できないと思っていたが、APIを良く見ると lastModified() というメソッドがあることがわかった。

java.util.Calendarに変換

lastModified()で得た値をCalendarに変換するには以下のようにする。

    File f=new File("foo.txt");
    cal=Calendar.getInstance();
    cal.setTimeInMillis( f.lastModified() );
    
    System.out.println(cal);

最終修正時間をもとにソート

lastModified() メソッドを使用して、最終変更日付の取得とそれを基にしたソートテストをしてみます。

テストコード

import java.io.*;
import java.util.*;


public class Sort{

	Comparator comparator=new Comparator(){
		public int compare(Object o1,Object o2){
			File f1=(File)o1;
			File f2=(File)o2;

			return (int)(f1.lastModified()-f2.lastModified());
		}
	};

	private File dir;
	public Sort(File dir){
		this.dir=dir;
	}
	public void sort(){
		File[] files=this.dir.listFiles();

		ArrayList list=new ArrayList();
		for(int i=0; i<files.length; i++){
			list.add(files[i]);
		}


		Collections.sort(list,this.comparator);

		for(int i=0; i<list.size(); i++){
			File f=(File)list.get(i);
			System.out.println( f.getName()+","+toCalendarString(f) );
		}
	}
	static private String toCalendarString(File f){

		Calendar cal=Calendar.getInstance();
		cal.setTimeInMillis( f.lastModified() );

		int y=cal.get(Calendar.YEAR);
		int m=cal.get(Calendar.MONTH);
		int day=cal.get(Calendar.DAY_OF_MONTH);

		return String.valueOf(y)+"-"+String.valueOf(m+1)+"-"+String.valueOf(day);
	}

	static public void main(String[] args){
		if(args.length==1){
			File dir=new File(args[0]);
			new Sort(dir).sort();
		}
	}
}

実行

    $ javac Sort.java
    $ java Sort ./

カレントディレクトリのファイルを日付順にソートして標準出力します。

© 2006-2012 Tomoaki Oshima