File.getCanonicalPath() と File.getAbsolutePath() の違い ― 2008年06月25日 18時26分47秒
そこで、もっと詳しい説明を見る事になる。「正規のパス名は、一意の絶対パスです。正規のパス名の正確な定義は、システムに依存します。」どうも、一意かどうかが、getCanonicalPath と getAbsolutePath の大きな違いらしい。しかも、システム依存とくるから不安に拍車がかかる。
さらに読み進めると「パス名から "." や ".." などの冗長名を削除し、シンボリックリンクを解決し (UNIX プラットフォームの場合)、ドライブ名の大文字小文字を適切に変換し (Microsoft Windows プラットフォームの場合) ます。」とある。この文章がいつも混乱の元になる。絶対パス名なのに、なぜ、"." や ".." などを削除するのかと。絶対パス名なら、本来これを含まないので、どの様な絶対パスなのかと混乱に陥る。
結局のところ、getCanonicalPath は リンクを追跡する getAbsolutePath だ。
コメント
_ 通りすがりの人 ― 2009年09月24日 13時58分04秒
_ uyota ― 2009年09月25日 10時14分35秒
コメントと分りやすい実行例をありがとうございます。
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2008/06/25/3595250/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
ソース:
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じゃないと問題が起こっちゃいますね。
勉強になりました。