2011-07-24 7 views
5

ここで私はで始まったコードです:名前を変更した後、Javaでファイルの最終更新時刻を設定しようとすると、それ

long modifiedTime = [some time here]; 
File oldFile = new File("old_name.txt"); 
boolean renamed = oldFile.renameTo(new File("new_name.txt"); 
boolean timeChanged = oldFile.setLastModified(modifiedTime); 

System.out.println("renamed: " + renamed); 
System.out.println("time changed: " + timeChanged); 

そして、私が見た出力されました:

renamed: true 
time changed: false 

しかし、私が試したとき:

long modifiedTime = [some time here]; 
boolean renamed = new File("old_name.txt").renameTo(new File("new_name.txt")); 
boolean timeChanged = new File("new_name.txt").setLastModified(modifiedTime); 

System.out.println("renamed: " + renamed); 
System.out.println("time changed: " + timeChanged); 

は、正常に動作するように見えました、この出力に:

renamed: true 
time changed: true 

なぜそれが第二のアプローチが動作することで、最初のものはないでしょうか?

答えて

4

最初に、存在しなくなったファイルの最後に変更された属性を変更しようとしています。あなたはちょうどその名前を変更したので。 2番目のケースでは、既存の有効なファイルの属性を変更しています。

これは、JavaクラスFileがネイティブコマンドよりも薄いラッパーであるために発生します。インスタンスold = new File("oldname")を作成した後にrenameという名前を付けて、oldインスタンスで何らかのメソッドを呼び出すと、実際にはシステムコールが実行され、ファイル名とコマンドの両方が送信されます。しかし、この時点でファイル名は無関係です。

今はっきりしていることを願っています。

+1

これは間違いなく明確です。しかし、それは悪いAPIデザインのように見える!私は、ファイルオブジェクトのrenameToを呼び出すと、ファイルのファイル名を実際に変更する突然変異の呼び出しになると思いますが、そうではないと思います。 –

1

Fileは、存在する場合と存在しない場合があるファイルまたはディレクトリへのパスを表します。

ファイルの名前を変更すると、元の名前のファイルは長くありません。

2

oldFile.renameTo(new File("new_name.txt"));は変更されません。oldFileが指しています。その呼び出し後にoldFileのパスはまだold_name.txtです。

したがって、その時点でold_name.txtが存在しないため、setLastModifiedコールが失敗します。

関連する問題