Java Gold試験において、入出力セクションは「暗記」と「ロジック」の両方が求められる難所です。特に、従来のjava.ioと新世代の**NIO.2(java.nio.file)**の仕様の違いは、非常に高い確率で出題されます。 本記事では、合格に向けて絶対に落とせない重要ポイントを整理し、実戦形式の10問を用意しました。
1. java.ioの急所:ストリームとシリアライズ
従来のI/Oでは、**「どのクラスがどの役割を持つか」**という構成の理解が鍵となります。
- ストリームの分類: * バイト(InputStream/OutputStream)
- 文字(Reader/Writer)
- シリアライズ(Serializable)の注意点:
- transient: シリアライズ対象外(復元するとnullや0になる)。
- static: クラス変数なので対象外。
- 継承: 親が Serializable でない場合、親のフィールド復元には「引数なしコンストラクタ」が必要。
2. NIO.2の核心:PathとFiles
試験のメインディッシュは、Java 7から導入されたNIO.2です。物理的なファイルが存在しなくても動作する「パス計算」のルールをマスターしましょう。
- resolve(Path): パスの結合。
- relativize(Path): 相対パスの計算。
- normalize():
..や.を整理。 - subpath(begin, end): パスの一部を切り出し(インデックスに注意)。
5. 実戦演習:Java Gold形式クイズ(全10問)
【第1問】Path.subpathの挙動
次のコードを実行した場合の出力結果は何ですか?
Java
Path path = Paths.get("/user/home/documents/data.txt");
System.out.println(path.subpath(1, 3));
A. user/home B. home/documents C. user/home/documents D. home/documents/data.txt
正解:B subpathのインデックスはルート直後から0, 1, 2…と数えます(0:user, 1:home, 2:documents)。
subpath(1, 3)は「インデックス1から3の手前(2)まで」を返すため、home/documentsとなります。
【第2問】Path.relativizeの計算
次のコードを実行した場合の出力結果は何ですか?
Java
Path p1 = Paths.get("code");
Path p2 = Paths.get("code/java/Gold.java");
System.out.println(p1.relativize(p2));
A. code/java/Gold.java B. java/Gold.java C. ../java/Gold.java D. コンパイルエラー
正解:B
p1(codeフォルダ)から見てp2はどこにあるか。codeの中にいる状態からcode/java/Gold.javaへ行くには、java/Gold.javaと進むだけです。
【第3問】シリアライズとtransient
以下のクラスをシリアライズし、その後デシリアライズして変数 value を出力した結果はどうなりますか?
Java
class Data implements Serializable {
static int id = 1;
transient String value = "Default";
}
A. Default B. null C. 1 D. 例外が発生する
正解:B
transientが付与されたフィールドは保存されません。デシリアライズ時、参照型変数は初期値であるnullに戻ります。
【第4問】Files.walkの特性
Files.walk(Path start) メソッドについて正しい説明はどれですか? A. デフォルトでシンボリックリンクを追跡する B. 幅優先探索(BFS)でファイルを辿る C. 深さ優先探索(DFS)でファイルを辿る D. ディレクトリは含まれず、ファイルのみを抽出する
正解:C
Files.walkはデフォルトで深さ優先探索です。また、無限ループ防止のため、デフォルトではシンボリックリンクは追跡しません。
【第5問】System.console()の罠
System.console() に関する記述として正しいものはどれですか? A. 常に非nullのオブジェクトを返す B. 背景プロセスやIDEのコンソールで実行される場合、nullを返すことがある C. パスワード入力用の readPassword() メソッドは存在しない D. 文字入力専用であり、フォーマット出力(printf)はできない
正解:B インタラクティブな端末が割り当てられていない場合、
nullを返します。これは試験の超定番ひっかけです。
【第6問】Path.resolveの結合
次のコードの出力結果は何ですか? Path p1 = Paths.get("/a/b"); Path p2 = Paths.get("c"); System.out.println(p1.resolve(p2)); A. /a/b/c B. c C. /c D. /a/b
正解:A
resolveに相対パスを渡すと、単純に結合されます。もしp2が絶対パス(/cなど)だった場合は、p2が優先されます。
【第7問】Path.normalizeの整理
Paths.get("/a/./b/../c").normalize() の出力結果は何ですか? A. /a/b/c B. /a/c C. /a/b/../c D. /c
正解:B
.(カレント)は消去、..(親)は一つ前の要素(この場合はb)と共に消去されます。結果として/a/cとなります。
【第8問】Files.linesの戻り値
Files.lines(path) メソッドが返す型は何ですか? A. List<String> B. Stream<String> C. String[] D. String
正解:B ファイルの内容を1行ずつ処理するための
Stream<String>を返します。メモリ効率が良いため、巨大なファイルに適しています。
【第9問】BufferedReaderのメソッド
BufferedReader クラスで使用できる、行を丸ごと読み込むメソッドはどれですか? A. read() B. readAll() C. readLine() D. getNextLine()
正解:C
readLine()です。戻り値はStringで、ファイルの終端(EOF)に達するとnullを返します。
【第10問】Serializableと継承
親クラスが Serializable を実装しておらず、子クラスだけが実装している場合、デシリアライズ時に親のフィールドはどうなりますか? A. 保存されていた値に復元される B. 親の引数なしコンストラクタが実行され、初期化される C. コンパイルエラーになる D. 実行時に NotSerializableException が投げられる
正解:B 親が
Serializableでない場合、親のフィールドは保存されません。復元時は親の引数なしコンストラクタが呼ばれて初期化されます。もし引数なしコンストラクタがない場合は実行時に例外が発生します。
まとめ:合格へのチェックリスト
[ ] Path.relativize と Path.resolve の計算ルールは完璧か? [ ] subpath(begin, end) のインデックスの数え方を間違えていないか? [ ] transient と static はシリアライズされないと覚えたか? [ ] System.console() は null になる可能性があることを理解したか?

I/OやNIO.2は、実際にコードを書いてみると「え、そうなるの?」という発見が多い分野です。特にパス操作は、物理ファイルを作らなくても Paths.get() だけで試せるので、迷ったら一度動かしてみるのが合格への近道です!











コメント