Edited at

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

More than 1 year has passed since last update.


背景

毎秒更新されるファイルが毎日0時に新しい日付で作成されます。

更新中のファイル以外で最新のファイルを特定したいなーと思ったので

その際のコードを書き残します。

こんなイメージ.png


更新日時を取得する

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);
}
}


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

1.png


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

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


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);
}
}
}


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

2.png


時間を計算する

時間を計算するには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日以内のファイルが取得できました。

3.png