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 }- A
/home/data/file.txt/../c/d//a/b/x/y - B
/home/user/data/file.txt/../c/d//a/b/x/y - C
/home/data/file.txt/../../c/d//a/b/x/y - D
/home/data/file.txt/../c/d/x/y
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓Gold監修
解説
Path の3メソッドはどれも純粋に文字列(パス要素)レベルの計算で、実ファイルの存在は問わない。
① normalize():冗長な要素を畳む。.(カレント)は除去、..(親)は直前の要素を1つ打ち消す。
/home/user/../data/./file.txt → user/.. が相殺、. が消えて → /home/data/file.txt。
② x.relativize(y):「x から見た y への相対パス」を作る。
x=/a/b、y=/a/c/d。共通の先頭は /a。x はそこから b が1つ余る → 1つ上がる(..)。y はそこから c/d → 下りる。結果 ../c/d。
③ x.resolve("x/y"):x に相対パスを連結する(引数が絶対パスならそれをそのまま返す)。
/a/b + x/y → /a/b/x/y。
- B
normalize()が..を畳まない前提。実際はuserが打ち消され/home/data/...。 - C
relativizeの「上がる回数」を誤算。x で余るのはbの1つだけなので..は1個(../c/d)。../../は2つ余る場合。 - D
resolve("x/y")は引数が相対なので連結される。引数をそのまま返すのは絶対パスを渡したとき。
ひっかけ: ①
relativize の方向(「x→y」であって「y→x」ではない)。② resolve は引数が絶対パスのときだけ引数を返し、相対なら連結。③ これらは I/O せず純粋に要素計算(実体が無くても動く)。実機確認の答え合わせ
出力: /home/data/file.txt ../c/d /a/b/x/y (注:toString の区切り文字はプラットフォーム依存。Windows では \ になる)
✓Gold 保有者による書き下ろし解説・実機で検証済