Fileクラス
lastModifiedメソッド
このファイルが最後に変更された時間を返します。
lastModified()
目次
1. 時間や日時は long型 で表します
「日時」は特定の日や、特定の時刻のこと。何月何日何時何分何秒 という感じです。
「時間」はある日時から ある日時までの間の長さのこと。何時間 何秒間 という感じです。
javaでは、時間や日時を long型 の値として扱います
時間については、常に 1L==1ミリ秒 で良いのですが、
日時は、人間が日時とわかる文字列 にするのに、ひと工夫必要になります。
日時には、うるう年やタイムゾーンがあって、一筋縄ではいきません。
Javaには、日時を扱うクラスが用意されていますので、それらを使用しましょう。
このページでは、String.formatメソッド を使用します。
日時はなんか
めんどくさそうっスね。
否定はしないけど、
割と何とかなるよ。
重要
- javaでは、時間や日時を long型 の値として扱います
- 1L==1ミリ秒です
- long型なので、小数点以下はナシで、マイナスはアリです
- 日時は、1970/01/01 00:00:00 000 が起点です(注)
(注) 世界標準時「1970/01/01 00:00:00」が基準です。
タイムゾーンが「日本-東京」のパソコンはロンドンから9時間の時差があるので
「1970/01/01
09:00:00 000」が起点になります。
とは言え実際にタイムゾーンを気にする場面は、ほぼ無いでしょう。
Sample12_00.java
long のリテラル
long のリテラルは、数値の後ろに「
l」又は「
L」(英数字のエル)です。
そのままの数値は、int のリテラルとして扱われますので、
intの範囲を超える数値はエラーになります。
ご留意ください。
ご参照↓
基本データ型一覧
これ割とハマるやつだ。
365日==31536000000ミリ秒で、
int ならアウトだ。
リテラルなら、31536000000L と書こう。
2. lastModifiedメソッド
ファイルの「更新日時」を、long型 で返します。
public long lastModified()
ファイルの更新日時は
わかるだろ?
これのことだ。
3. サンプルコード
前回作成した「Sample11_02.class」の更新日を調べてみましょう。
ここでは、long型で得た日時データを、
String.formatメソッドを利用して日付文字列にしています。
//Sample12_01.java
import java.io.File;
class Sample12_01{
public static void main(String[] args){
File file = new File("Sample11_02.class");
long last = file.lastModified();
System.out.println(last);
String strDate = String.format(
"%1$tY年%1$tm月%1$td日 %1$tH時%1$tM分%1$tS秒 %1$tLミリ秒",
last);
System.out.println(strDate);
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample12_01.java
ws>java Sample12_01
1626659435391 ← long型での値。
2021年07月19日 10時50分35秒 391ミリ秒
ws>
String.format のくだりが
えらい長くなってしまったが、
実際には必要な部分だけ使えばいい。
なるほど。
ちなみに、「更新日」って
何に使えるの?
lastModifiedメソッドは、ファイルのリストを古い順に並べ替えたり、
最も新しいファイルを探したりするのに良く用います。
この様な場合は long型のまま利用できます。
月別にディレクトリを分ける様な場合には、年と月だけを取り出して使うといいでしょう。
今後、日付を取り扱うクラスも紹介させていただきますが、
実践では、String.formatメソッドで、かなり対応できますよ。
年と月だけを取り出す例
String strDate = String.format("%1$tY_%1$tm, last);
4. 最も新しいファイルを探す
listFilesメソッドを利用して取得したFile配列の中から、
最も更新日が新しいファイル、又はディレクトリを探してみましょう。
大小関係であれば、long型のまま比較するのが良いでしょう。
//Sample12_02.java
import java.io.File;
class Sample12_02{
public static void main(String[] args){
File dir01 = new File(".");
File[] files = dir01.listFiles();
if(files!=null){
int lastestIndex = 0;
long maxModi = files[0].lastModified();
if(files.length>1){
for(int i=1; i<files.length; i++){
long modi = files[i].lastModified();
if(modi>maxModi){
maxModi = modi; //大きい方の更新日を保存
lastestIndex = i; //↑のインデックスを保存
}
}
}
File lastestFile = files[lastestIndex];
System.out.println("lastestFile: " + lastestFile.getPath());
String strDate = String.format(
"%1$tY/%1$tm/%1$td %1$tH:%1$tM",
maxModi
);
System.out.println("lastModified: " + strDate);
}else{
System.out.println("is null.");
}
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample12_02.java
ws>java Sample12_02
lastestFile: ./Sample12_02.class
lastModified: 2021/07/20 10:58
ws>
大きい方の lastModified の値と
その値があったインデックスの
2つを保持しているのね。
そう。
要素そのものを保持するより
スマートじゃない?
時間や日時の取り扱いについては、いずれ紹介させていただきますね。
お疲れ様でした。
テンキーの「Enter」だとダメな場合があります。