PR

Java.ioを使用したファイルの読み書き(ストリームとは?)方法を3分で解説

Java

Javaのjava.ioパッケージ(参考 Javaの「パッケージ」とは?)を使うとファイルの読み書き系の処理を簡単に行うことができます。

簡単に言えば、Javaでファイルを操作したい!というときに利用できるパッケージです。

java.ioパッケージには、テキストファイルやバイナリファイルを扱うための便利なクラスがたくさん用意されており、これを使うことで効率的なファイル操作が可能になります。ファイルの読み書きができるようになると、データの保存や読み込みがスムーズに行えるようになるので、活用必須の超・重要知識です。

スポンサーリンク

java.ioとは

java.ioは、Javaでファイルやデータを入力(読み込み:i)・出力(書き込み:o)するためのツールがたくさん入ったパッケージ(ツール集)です。このパッケージには、テキストファイルやバイナリファイルを簡単に操作するためのクラスが揃っています。

例えば、ファイルからデータを読み込んだり、ファイルにデータを書き込んだりするのに使います。

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で一通りのファイル操作が可能になるということです。

インプットストリーム/アウトプットストリームのイメージと概念

ここで、ioパッケージを理解するために必要な「ストリーム」の概念について説明しておきます。

プログラミングでは「ストリーム(Stream)」という考え方がよく使われます。これは、「水がパイプを通って流れていくイメージ」 に近い概念です。ここでは、インプットストリーム(InputStream)とアウトプットストリーム(OutputStream)を、できるだけやさしい言葉で説明しておきます。

ステップ1: 「ストリーム」とは何か?

  • ストリームとは、「データの流れ」を扱う仕組み。
  • 例えば、水道の水がパイプを通して流れるように、データもストリームを通じて流れます
  • そのパイプ(ストリーム)に「入口」と「出口」があるとイメージしてください。

ステップ2: インプットストリーム(InputStream)のイメージ

  • インプットストリームは、外(ファイルやネットワークなど)からプログラムの中へデータが流れ込む入り口です。
  • たとえば、ファイルから文字や数字などの情報を読み込みたいときに使います。
  • 水道で言えば、外部から家の中に水が入ってくるイメージです。

具体例:

  1. あなたが作ったプログラムが、テキストファイルに書かれた内容を読みたい。
  2. そのとき、プログラムはInputStreamを使って、ファイルのデータを一文字ずつ、もしくはいくつかのまとまりで受け取ります。

ステップ3: アウトプットストリーム(OutputStream)のイメージ

  • アウトプットストリームは、プログラムの中から外へデータが流れ出す出口です。
  • たとえば、何か計算した結果をファイルに書き込みたいときに使います。
  • 水道で言えば、家の中から外へ水が排水されるイメージに似ています。

具体例:

  1. あなたのプログラムが何か文字列を作り出した。
  2. その文字列をファイルに書き込むとき、OutputStreamを使って、ファイルへデータを順番に送り出します

ステップ4: なぜストリームを使うのか?

  • データを少しずつ読み書きするため
    • 大きなファイルを一度にすべて読み込むと、メモリを大量に使ってしまう可能性があります。ストリームを使えば、データを部分的に扱えるので効率的です。
  • 様々な入力元・出力先を同じ方法で扱える
    • ファイル、ネットワーク、メモリ上のバイト配列など、いろいろな場所とのデータやり取りを「同じ仕組み」で実現できます。

ステップ5: まとめとイメージを固めるポイント

  • ストリームは「パイプ」。入力(インプットストリーム)と出力(アウトプットストリーム)がある。
  • インプットストリーム: データが外部→プログラムへ流れる。
  • アウトプットストリーム: データがプログラム→外部へ流れる。
  • ファイルの読み書きだけでなく、ソケット通信(ネットワークでのやりとり)や、メモリからの読み書きなどにも応用されている。

Java.ioパッケージの使い方:ファイルの読み書き

ここでは、テキストファイルの読み書きを例にして説明します。この例を通して、java.ioパッケージの基本的な使い方を理解しましょう。

サンプルコード テキストファイルへの書き込み

テキストファイルにデータを書き込み、その後、書き込んだデータを読み込むプログラムの例。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
}
}
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(); } } }
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();
        }
    }
}
  1. FileWriter
    • FileWriterは、テキストファイルに文字データを書き込むためのクラス。
  2. try-with-resources構文
    • この構文は、Java 7で導入されたもので、リソース(ここではファイル)を自動的に閉じることができるようにするためのもの。tryブロックの後にリソースを指定すると、tryブロックが終了したときに自動的にリソースがクローズ→リソースリークを防ぐために非常に有用な手段でJava.ioパッケージとセットで頻繁に利用されます。(関連 try-catch構文
  3. IOException
    • ファイル操作を行う際には、入出力エラー(IOException)が発生する可能性があります。例えば、ファイルが存在しない場合や、読み書きの途中でエラーが発生した場合。これらのエラーは、try-catchブロックでキャッチして処理します。ここでは、エラーが発生した場合にスタックトレースを出力することで、エラーの詳細を確認できるようにしています。

サンプルコード ファイルの読み込み

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
}
}
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(); } } }
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();
        }
    }
}

  1. FileReader
    • FileReaderは、テキストファイルから文字データを読み込むためのクラスです。コンストラクタにファイル名を渡すと、そのファイルを開きます。
  2. IOException
    • ファイル操作中にエラーが発生した場合、IOExceptionがスローされます。try-catchブロックでこの例外をキャッチし、エラーメッセージを出力しています。
  3. データの読み込み
    • FileReaderreadメソッドを使って、ファイルから1文字ずつデータを読み込みます。読み込んだデータは整数値として返されるため、それを文字型に変換して出力。ファイルの終わりに達すると、readメソッドは-1を返します。

java.ioパッケージの便利な機能

java.ioパッケージには、ファイルの読み書き以外にも多くの便利な機能が含まれています。ここでは、いくつかの重要なポイントと知っておくべき内容を紹介します。

ファイルとディレクトリの操作

java.io.Fileクラスは、ファイルやディレクトリの操作を行うための基本的なクラスです。このクラスを使用して、ファイルやディレクトリの作成、削除、名前の変更、情報の取得などができます。

サンプルコード ファイルとディレクトリの操作

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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");
}
}
}
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"); } } }
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");
        }
    }
}

  1. existsメソッド
    • ファイルの存在を確認する
  2. createNewFileメソッド
    • 新しいファイルを作成する
  3. deleteメソッド
    • ファイルを削除する

サンプルコード ディレクトリの操作

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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");
}
}
}
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"); } } }
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");
        }
    }
}
  1. mkdirメソッド
    • ディレクトリを作成する
  2. listメソッド
    • ディレクトリ内のファイルやディレクトリの名前を取得する
  3. deleteメソッド
    • 空のディレクトリを削除する

シリアライズとデシリアライズ

シリアライズは、オブジェクトをバイトストリームに変換してファイルに保存することを指します。デシリアライズは、その逆で、バイトストリームからオブジェクトを復元することです。これにはObjectOutputStreamObjectInputStreamを使用します。

Q
バイトストリームとは?
A

データをバイト単位で読み書きするためのストリームです。ストリームとは、データの流れを抽象化したもので、データを順序よく処理することができます。Javaでは、バイトストリームを使ってバイナリデータ(画像、音声、ビデオファイルなど)やテキストデータを読み書きします。

サンプルコード オブジェクトのシリアライズとデシリアライズ

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
}
}
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(); } } }
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();
        }
    }
}
  1. Personクラス
    • Serializableインターフェースを実装しています。このインターフェースを実装することで、そのオブジェクトがシリアライズ可能になります。
  2. ObjectOutputStream
    • オブジェクトをファイルにシリアライズ。
  3. ObjectInputStream
    • ファイルからオブジェクトをデシリアライズします。

タイトルとURLをコピーしました