I/O・NIO.2(入出力)完全攻略ガイド|Java Gold頻出のファイル操作を網羅

【Java Gold対策】

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.relativizePath.resolve の計算ルールは完璧か? [ ] subpath(begin, end) のインデックスの数え方を間違えていないか? [ ] transientstatic はシリアライズされないと覚えたか? [ ] System.console()null になる可能性があることを理解したか?

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

tibiyaのアバター tibiya ITエンジニア

文系卒あほエンジニア
趣味はゲームとギャンブルとテニスっぽいスポーツと釣りです
Java javascript angular react C#

コメント

コメントする

目次