対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
NIO.2(Path 操作)難易度 高無料

次のコードの出力として正しいものを選べ(UNIX系ファイルシステム=区切り文字は /)。

1   import java.nio.file.*;
2   public class Q4 {
3       public static void main(String[] a) {
4           Path p = Paths.get("/home/user/../data/./file.txt");
5           System.out.println(p.normalize());
6           Path x = Paths.get("/a/b");
7           Path y = Paths.get("/a/c/d");
8           System.out.println(x.relativize(y));
9           System.out.println(x.resolve("x/y"));
10      }
11  }
  1. A/home/data/file.txt../c/d/a/b/x/y
  2. B/home/user/data/file.txt../c/d/a/b/x/y
  3. C/home/data/file.txt../../c/d/a/b/x/y
  4. D/home/data/file.txt../c/dx/y
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AGold監修

解説

Path の3メソッドはどれも純粋に文字列(パス要素)レベルの計算で、実ファイルの存在は問わない。

normalize():冗長な要素を畳む。.(カレント)は除去、..(親)は直前の要素を1つ打ち消す。
/home/user/../data/./file.txtuser/.. が相殺、. が消えて → /home/data/file.txt

x.relativize(y):「x から見た y への相対パス」を作る。
x=/a/by=/a/c/d。共通の先頭は /a。x はそこから b が1つ余る → 1つ上がる(..。y はそこから c/d → 下りる。結果 ../c/d

x.resolve("x/y"):x に相対パスを連結する(引数が絶対パスならそれをそのまま返す)。
/a/bx/y/a/b/x/y

各誤答が違う理由
  • Bnormalize().. を畳まない前提。実際は user が打ち消され /home/data/...
  • Crelativize の「上がる回数」を誤算。x で余るのは b の1つだけなので .. は1個(../c/d)。../../ は2つ余る場合。
  • Dresolve("x/y") は引数が相対なので連結される。引数をそのまま返すのは絶対パスを渡したとき
ひっかけ:relativize の方向(「x→y」であって「y→x」ではない)。② resolve は引数が絶対パスのときだけ引数を返し、相対なら連結。③ これらは I/O せず純粋に要素計算(実体が無くても動く)。
実機確認の答え合わせ
出力:
/home/data/file.txt
../c/d
/a/b/x/y
(注:toString の区切り文字はプラットフォーム依存。Windows では \ になる)
Gold 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
NIO.2 を含む全問を分野別に演習できます(無料)。
演習する →