Javaで学ぶ入出力入門

# 導入

Javaでは、ファイルの読み書きやコンソール入力を簡単に行う方法が用意されています。本記事では、Javaを使ったデータ入出力について、基礎から具体的なコード例までをわかりやすく解説します。

# Javaのストリームについて

Javaでは、**ストリーム**を使ってデータを扱います。ストリームはデータの流れを抽象化したもので、大きく分けて以下の2種類があります：

- **文字ストリーム**: テキストデータの読み書きに使います。`Reader`と`Writer`クラスを使います。
- **バイトストリーム**: バイナリデータ（画像、音声など）の読み書きに使います。`InputStream`と`OutputStream`クラスを使います。

文字ストリームはテキストデータに、バイトストリームはバイナリデータに適しています。

## コンソールでのデータ入出力

コンソール（画面）でのデータのやり取りには、標準入力（キーボード入力）、標準出力（画面表示）、標準エラー出力（エラー表示）があります。

### キーボードからの入力を読む

キーボードからの入力は、`Scanner`クラスを使うのが一般的です。

```java
import java.util.Scanner;

public class SampleIO {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("名前を入力してください: ");
        String name = scanner.nextLine();
        System.out.println("こんにちは、" + name + "さん！");
        
        scanner.close();
    }
}
```

この例では、`Scanner`を使ってキーボード入力を取得し、それを画面に表示しています。

### 画面に文字を出力する

画面に文字を出すには、`System.out`を使います。これは`PrintStream`というオブジェクトで、様々な形式で出力できます。

```java
public class SampleConsoleOutput {
    public static void main(String[] args) {
        System.out.println("Hello World!");
        System.out.printf("私の年齢は %d 歳です。\n", 30);
    }
}
```

`System.out.println`は指定した文字を改行付きで出力し、`System.out.printf`はフォーマット指定子を使って出力します。

### エラーメッセージを出す

エラーメッセージは`System.err`を使います。`System.err`も`PrintStream`のオブジェクトです。

```java
public class SampleConsoleError {
    public static void main(String[] args) {
        System.err.println("エラー: システムでエラーが発生しました。");
    }
}
```

エラーメッセージを表示する際に便利です。

## ファイルの入出力

ファイルの読み書きには、文字ストリームとバイトストリームを使う方法があります。ここではその方法を紹介します。

### ファイルからデータを読む

ファイルからデータを読むには、`FileReader`（文字ストリーム）または`FileInputStream`（バイトストリーム）を使います。例として、`BufferedReader`を使ってファイルを行ごとに読む方法を示します。

```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class SampleFileRead {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("java.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```

`BufferedReader`を使うと、ファイルの内容を効率よく読み取れます。

### ファイルにデータを書く

ファイルにデータを書くには、`FileWriter`（文字ストリーム）または`FileOutputStream`（バイトストリーム）を使います。ここでは、`BufferedWriter`を使って文字をファイルに書く例を示します。

```java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class SampleFileWrite {
    public static void main(String[] args) {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter("out-java.txt"));
            bw.write("メッセージです。");
            bw.newLine();
            bw.write("Javaによってテキストを出力します。");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```

`BufferedWriter`を使うと、効率的に文字データを書き込めます。

### `Files`クラスを使ったファイル操作（Java 7以降）

Java 7以降では、`Files`クラスを使うと簡単にファイル操作ができます。

```java
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.io.IOException;
import java.util.List;

public class SampleFiles {
    public static void main(String[] args) {
        // ファイルにデータを書く
        try {
            Files.write(Paths.get("file-output.txt"), "ファイルです。\n2行目の内容です。".getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // ファイルからデータを読む
        try {
            List<String> lines = Files.readAllLines(Paths.get("file-output.txt"));
            lines.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

`Files.write`は文字列のバイト配列をファイルに書き込み、`Files.readAllLines`はファイルの全行をリストとして読み込みます。

# 終わりに

この記事では、Javaを使ったコンソールやファイルの入出力について説明しました。

- **コンソール入出力**: `Scanner`、`System.out`、`System.err`を使います。
- **ファイルの入出力**: `FileReader`、`FileWriter`、`BufferedReader`、`BufferedWriter`、および`Files`クラスを使います。
- **例外処理**: 入出力操作中のエラーを`try-catch`で処理します。

これらの基本を押さえることで、実用的なJavaアプリケーションのデータ処理ができるようになります。