File.getCanonicalPath() と File.getAbsolutePath() の違い2008年06月25日 18時26分47秒

javadoc でこの二つの説明を読むと、とても回りくどく書かれている。「この抽象パス名の正規のパス名文字列を返します。」とあっても良く判らない。

そこで、もっと詳しい説明を見る事になる。「正規のパス名は、一意の絶対パスです。正規のパス名の正確な定義は、システムに依存します。」どうも、一意かどうかが、getCanonicalPath と getAbsolutePath の大きな違いらしい。しかも、システム依存とくるから不安に拍車がかかる。

さらに読み進めると「パス名から "." や ".." などの冗長名を削除し、シンボリックリンクを解決し (UNIX プラットフォームの場合)、ドライブ名の大文字小文字を適切に変換し (Microsoft Windows プラットフォームの場合) ます。」とある。この文章がいつも混乱の元になる。絶対パス名なのに、なぜ、"." や ".." などを削除するのかと。絶対パス名なら、本来これを含まないので、どの様な絶対パスなのかと混乱に陥る。

結局のところ、getCanonicalPath は リンクを追跡する getAbsolutePath だ。

コメント

_ 通りすがりの人 ― 2009年09月24日 13時58分04秒

実行してみて分かりました。

ソース:
file = new File("..\\test");
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());

結果:
..\test
H:\.workspace\default\executor\..\test
H:\.workspace\default\test

クラスの作成時のパラメータを知りたいときはgetPath。
クラスの作成時のパラメータを大切にしていながらも絶対パスを取れるのがgetAbsolutePath。
とにかく一意にしてるのがgetCanonicalPath。

パスをキーにしてハッシュマップで一意にファイルを管理するとgetCanonicalPathじゃないと問題が起こっちゃいますね。

勉強になりました。

_ uyota ― 2009年09月25日 10時14分35秒

今見返すと、私の記述も分りやすいものではないですね。

コメントと分りやすい実行例をありがとうございます。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2008/06/25/3595250/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。