日々常々

ふつうのプログラマがあたりまえにしたいこと。

Javaでファイルのタイムスタンプ変更

Javaでファイルを扱うにはjava.io.Fileクラスを使用します。
Fileクラス自体はファイルそのものでもなんでもなく、ファイルまたはディレクトリのパスを持っています。Fileクラスのインスタンスファイルシステムで管理されているファイルと対になるとは限りません。例えば、C:\work\file1.txtが存在し、C:\work\file2.txtが存在しない場合でも、以下のコードは実行可能であり、例外を投げる事もありません。

File file1 = new File("C:/work/file1.txt");
File file2 = new File("C:/work/file2.txt");

Fileクラスはあくまでファイルへのパスのみであり、そのファイルが存在するか否かは、インスタンス生成には無関係です。なお、ファイルの存在はインスタンス生成後に exists で取得できます。存在しないファイルのインスタンスが生成できないなら、このメソッドは無意味になります。
また、Fileクラスはファイルの読み書きを行いません。あくまでパスのみを管理し、実際の読み書きは FileReader/FileWriter とか FileInputStream/FileOutputStream とかを使用します。

掲題の「ファイルのタイムスタンプ変更」ですが、ここまでの前提から「Fileクラスはファイルそのものを操作しない」という認識から別のクラスでの実装かと思ったりもするのですが、Fileクラスにて行います。
更新日時は lastModified で設定します。ざっくり書くとこんな感じ。

File file = new File("C:/work/test.txt");
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(2000, 10, 22, 12, 34, 56);
file.setLastModified(cal.getTimeInMillis());

実行前後にコマンドプロンプトからdirした結果は以下の感じです。

dirの結果(実行前)
2010/07/19  11:58                 0 test.txt
dirの結果(実行後)
2000/11/22  12:34                 0 test.txt

Fileクラスはファイルへのパスのみを管理するものだと理解していると見つけられないかもしれません。Javadocにもそんな感じに書かれていますし、私もついこの前までそういう理解でした。*1
Fileクラスの出来る事を見てみると、 exists でファイル有無を取得できますし、 mkdir や renameTo なんてものもあります。これらを考えると、ファイルパスを介してファイルシステムとやりとりするクラスと認識して良いかもしれません。

*1:http://java.sun.com/javase/ja/6/docs/ja/api/java/io/File.html「ファイルおよびディレクトリのパス名の抽象表現です。」