1Z0-826-JPN 対応
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/d / x/y
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓有資格者監修

解説

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。

各誤答が違う理由
  • 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 では \ になる)
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
NIO.2 を含む問題を分野別に演習できます。
演習する →