メモ : 【Java】更新日が1日以内のファイルを特定する


背景

毎秒更新されるファイルが毎日0時に新しい日付で作成されます。
更新中のファイル以外で最新のファイルを特定したいなーと思ったので
その際のコードを書き残します。

更新日時を取得する

File.lastModified()で更新日を取得します。
でも、返ってくる値はLong型で数字の羅列なので、識別できるようにSimpleDateFormatを使って
"yyyy/MM/dd HH:mm:ss" という形式で表示しています。

test.java
import java.io.File;
import java.text.SimpleDateFormat;

public class test{

  public static void main(String[] args){

    String filepath = "C:/tedkuma/BOX/20180729.csv";             //参照するディレクトリ
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//日付時刻の書式定義
    File targetFile = new File(filepath);
    Long lastModified = targetFile.lastModified();   //更新日時取得するのにlastModified()を使う。
    String update_time = simpleDateFormat.format(lastModified);  //longで来た値をsimpleDateFormatで整形
    System.out.println(update_time);
  }
}

では、実行してみます。更新日時が取得できました。

ファイル名を書き出す処理と組み合わせてみる

以前書いた ディレクトリの中身を確認する を使って複数あるファイルの名前と更新日を書き出します。

test.java
import java.io.File;
import java.text.SimpleDateFormat;

public class test
{
    public static void main(String[] args)
    {
        String filepath = "C:/tedkuma/BOX/";

        File dir = new File(filepath);
        File[] list = dir.listFiles();          //listFilesを使用してファイル一覧を取得
        for(int i=0; i<list.length; i++) {
          String filename = list[i].getName();
          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//日付時刻の書式定義
          File targetFile = new File(filepath+filename);
          Long lastModified = targetFile.lastModified();
          String update_time = simpleDateFormat.format(lastModified);
          System.out.println(update_time+":"+filename);
        }
    }
}

では、実行してみます。ファイル名と更新日が表示できました。

時間を計算する

時間を計算するにはCalendarクラスを使います。(import java.util.Calendar;を追加)
Calendar.getInstance()で現在の時間を取得できます。
変数.add(Calendar.DATE, 1);で 1日後の時間、 DATEをMINUTEに変えれば1分後、
第2引数の 1 を -1 に変えることで1日前や1分前という時間を取得することもできます。

更新日を取得したlastModified(long型)から直接Calendar型に変換できないので
どちらにも変換できるDate型を使用しています。(import java.util.Date;を追加)

compareTo()を使用して大小を比較することが出来ます。
A.compareTo(B) という書き方をしたときに
 A > B Aが前の時は -1
 A < B Aが後の時は  1
 A = B  同じ時は  0 が返ります。

更新済みファイルから更新日が1日以内のファイルを特定する

毎秒更新されている更新中のファイルは取得したくないので
if条件に更新時間は1日以内でかつ、10分以上経過しているものというのを入れました。

test.java
import java.io.File;
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class test{

    public static void main(String[] args){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String filepath = "C:/tedkuma/BOX/";

        File dir = new File(filepath);
        File[] list = dir.listFiles();

        Calendar st = Calendar.getInstance();//Calendarクラスで現在日時を取得
        st.add(Calendar.DATE, -1);           //1日前を取得
        Date start = st.getTime();           //Dateに直す

        Calendar en = Calendar.getInstance();//Calendarクラスで現在日時を取得
        en.add(Calendar.MINUTE, -10);        //10分前を取得
        Date end = en.getTime();

        for(int i=0; i<list.length; i++) {  //対象のパス内のファイル分処理を実行
          String filename = list[i].getName();
          File targetFile = new File(filepath+filename);
          Long lastModified = targetFile.lastModified();
          Date koushin = new Date(lastModified);

          if(start.compareTo(koushin)<0 && end.compareTo(koushin)>0){//compareToで比較
            String update_time = simpleDateFormat.format(koushin);
            System.out.println(update_time+":"+filename);
          }
        }
    }
}

では、実行してみます。更新中のファイルを除いて更新1日以内のファイルが取得できました。