Javaのjava.io
パッケージを使うとファイルの読み書き系の処理を簡単に行うことができます。
java.io
パッケージには、テキストファイルやバイナリファイルを扱うための便利なクラスがたくさん用意されており、これを使うことで効率的なファイル操作が可能に。ファイルの読み書きができるようになると、データの保存や読み込みがスムーズに行えるようになるので、活用必須の超・重要知識です。
java.ioとは
java.io
は、Javaでファイルやデータを入力(読み込み)・出力(書き込み)するためのツールがたくさん入ったパッケージ(ツール集)です。このパッケージには、テキストファイルやバイナリファイルを簡単に操作するためのクラスが揃っています。
例えば、ファイルからデータを読み込んだり、ファイルにデータを書き込んだりするのに使います。
java.io
を使うことで、ファイル操作がシンプルで効率的に行えるようになります。
java.ioパッケージの主要なクラス
以下は、java.io
パッケージに含まれる主要なクラス。まずは、このパッケージを使うことでどんな処理が行えそうなのか?を概要を押さえておきます。
クラス名 | 説明 |
---|---|
File | ファイルやディレクトリを表すクラス。 ファイルの作成、削除、情報取得に使用される。 |
FileReader | テキストファイルを読み込むためのクラス。 |
FileWriter | テキストファイルに書き込むためのクラス。 |
BufferedReader | テキストファイルの効率的な読み込みをサポートするクラス。 |
BufferedWriter | テキストファイルの効率的な書き込みをサポートするクラス。 |
FileInputStream | バイナリファイルを読み込むためのクラス。 |
FileOutputStream | バイナリファイルに書き込むためのクラス。 |
InputStreamReader | バイト入力ストリームを文字入力ストリームに変換するクラス。 |
OutputStreamWriter | 文字出力ストリームをバイト出力ストリームに変換するクラス。 |
ObjectInputStream | オブジェクトを読み込むためのクラス(シリアライズとデシリアライズに使用)。 |
ObjectOutputStream | オブジェクトを書き込むためのクラス(シリアライズとデシリアライズに使用)。 |
PrintWriter | 文字出力を簡単に行うためのクラス。 |
PrintStream | バイト出力を簡単に行うためのクラス。 |
RandomAccessFile | ファイルのランダムアクセス(任意の位置から読み書き)を可能にするクラス。 |
java.io
パッケージは、さまざまな形式のファイル(csvやtxtはもちろん、json形式など)を扱うことができます。また、「.bin」や「.jpg」などのバイナリファイルも扱うことができます。つまり、このパッケージの使い方をある程度マスターすれば、Javaで一通りのファイル操作が可能になるということ。
ここからは代表的ないくつかのクラスを用いて簡単なファイル操作を行う例をご説明していきます。
Java.ioパッケージの使い方:ファイルの読み書き
ここでは、テキストファイルの読み書きを例にして説明します。この例を通して、java.io
パッケージの基本的な使い方を理解しましょう。
サンプルコード テキストファイルへの書き込み
テキストファイルにデータを書き込み、その後、書き込んだデータを読み込むプログラムの例。
import java.io.FileWriter; import java.io.IOException; public class SimpleFileWriteExample { public static void main(String[] args) { // ファイルに書き込む内容 String content = "Hello, World!\nWelcome to java.io package."; // FileWriterを使ってファイルに書き込み try (FileWriter fw = new FileWriter("example.txt")) { fw.write(content); System.out.println("ファイルへの書き込みが完了しました。"); } catch (IOException e) { e.printStackTrace(); } } }
- FileWriter
FileWriter
は、テキストファイルに文字データを書き込むためのクラス。
- try-with-resources構文
- この構文は、Java 7で導入されたもので、リソース(ここではファイル)を自動的に閉じることができるようにするためのもの。
try
ブロックの後にリソースを指定すると、try
ブロックが終了したときに自動的にリソースがクローズ→リソースリークを防ぐために非常に有用な手段でJava.ioパッケージとセットで頻繁に利用されます。(関連 try-catch構文)
- この構文は、Java 7で導入されたもので、リソース(ここではファイル)を自動的に閉じることができるようにするためのもの。
- IOException
- ファイル操作を行う際には、入出力エラー(IOException)が発生する可能性があります。例えば、ファイルが存在しない場合や、読み書きの途中でエラーが発生した場合。これらのエラーは、
try-catch
ブロックでキャッチして処理します。ここでは、エラーが発生した場合にスタックトレースを出力することで、エラーの詳細を確認できるようにしています。
- ファイル操作を行う際には、入出力エラー(IOException)が発生する可能性があります。例えば、ファイルが存在しない場合や、読み書きの途中でエラーが発生した場合。これらのエラーは、
サンプルコード ファイルの読み込み
import java.io.FileReader; import java.io.IOException; public class SimpleFileReadExample { public static void main(String[] args) { // FileReaderを使ってファイルから読み込み try (FileReader fr = new FileReader("example.txt")) { int character; while ((character = fr.read()) != -1) { System.out.print((char) character); } } catch (IOException e) { e.printStackTrace(); } } }
- FileReader
FileReader
は、テキストファイルから文字データを読み込むためのクラスです。コンストラクタにファイル名を渡すと、そのファイルを開きます。
- IOException
- ファイル操作中にエラーが発生した場合、
IOException
がスローされます。try-catch
ブロックでこの例外をキャッチし、エラーメッセージを出力しています。
- ファイル操作中にエラーが発生した場合、
- データの読み込み
FileReader
のread
メソッドを使って、ファイルから1文字ずつデータを読み込みます。読み込んだデータは整数値として返されるため、それを文字型に変換して出力。ファイルの終わりに達すると、read
メソッドは-1
を返します。(参考 メソッドとは?)
java.ioパッケージの便利な機能
java.io
パッケージには、ファイルの読み書き以外にも多くの便利な機能が含まれています。ここでは、いくつかの重要なポイントと知っておくべき内容を紹介します。
ファイルとディレクトリの操作
java.io.File
クラスは、ファイルやディレクトリの操作を行うための基本的なクラスです。このクラスを使用して、ファイルやディレクトリの作成、削除、名前の変更、情報の取得などができます。
サンプルコード ファイルとディレクトリの操作
import java.io.File; import java.io.IOException; public class FileExample { public static void main(String[] args) { File file = new File("example.txt"); // ファイルの存在確認 if (file.exists()) { System.out.println("File exists"); } else { System.out.println("File does not exist"); // ファイルの作成 try { if (file.createNewFile()) { System.out.println("File created"); } else { System.out.println("File already exists"); } } catch (IOException e) { e.printStackTrace(); } } // ファイルの削除 if (file.delete()) { System.out.println("File deleted"); } else { System.out.println("Failed to delete file"); } } }
exists
メソッド- ファイルの存在を確認する
createNewFile
メソッド- 新しいファイルを作成する
delete
メソッド- ファイルを削除する
サンプルコード ディレクトリの操作
import java.io.File; public class DirectoryExample { public static void main(String[] args) { File dir = new File("exampleDir"); // ディレクトリの作成 if (!dir.exists()) { if (dir.mkdir()) { System.out.println("Directory created"); } else { System.out.println("Failed to create directory"); } } // ディレクトリの内容をリスト化 String[] files = dir.list(); if (files != null) { for (String file : files) { System.out.println(file); } } // ディレクトリの削除 if (dir.delete()) { System.out.println("Directory deleted"); } else { System.out.println("Failed to delete directory"); } } }
mkdir
メソッド- ディレクトリを作成する
list
メソッド- ディレクトリ内のファイルやディレクトリの名前を取得する
delete
メソッド- 空のディレクトリを削除する
シリアライズとデシリアライズ
シリアライズは、オブジェクトをバイトストリームに変換してファイルに保存することを指します。デシリアライズは、その逆で、バイトストリームからオブジェクトを復元することです。これにはObjectOutputStream
とObjectInputStream
を使用します。
- Qバイトストリームとは?
- A
データをバイト単位で読み書きするためのストリームです。ストリームとは、データの流れを抽象化したもので、データを順序よく処理することができます。Javaでは、バイトストリームを使ってバイナリデータ(画像、音声、ビデオファイルなど)やテキストデータを読み書きします。
サンプルコード オブジェクトのシリアライズとデシリアライズ
import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 1L; String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class SerializationExample { public static void main(String[] args) { Person person = new Person("Alice", 30); // シリアライズ try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { oos.writeObject(person); System.out.println("オブジェクトがシリアライズされました。"); } catch (IOException e) { e.printStackTrace(); } // デシリアライズ try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person deserializedPerson = (Person) ois.readObject(); System.out.println("デシリアライズされたオブジェクト: " + deserializedPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
Person
クラスSerializable
インターフェースを実装しています。このインターフェースを実装することで、そのオブジェクトがシリアライズ可能になります。
ObjectOutputStream
- オブジェクトをファイルにシリアライズ。
ObjectInputStream
- ファイルからオブジェクトをデシリアライズします。