Java におけるファイル操作の基本

標準ファイル入出力についてまとめました。

## 代表的なクラスやメソッド
### ファイルの読み込み

ファイル読み込みのサンプルコードを以下に記します。

```java:readFile.java
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ReadFile {
  public static void main(String args[]) {
    try {
      File file = new File("c:¥¥tmp¥¥test.txt");
      FileReader filereader = new FileReader(file);
      int ch;
      while((ch = filereader.read()) != -1){
        System.out.print((char)ch);
      }
      filereader.close();
    } catch(FileNotFoundException e) {
      System.out.println(e);
    } catch(IOException e) {
      System.out.println(e);
    }
  }
}
```

- File 型の変数 file には、new された File に文字列として  
渡されているディレクトリにあるファイルが代入される  
今回は↓のファイルが代入されるものとする

```test.txt
abcdef
日本語
```

- FileReader 型の変数 fileReader に file が代入される
- while 文ではファイルの中身を上から一行ずつ読まれ、都度出力される  
例外が発生しなかった場合の出力結果は以下の通り


```
abcdef
日本語
```

- close メソッドが実行されることで処理が終了する
- ファイルが存在しなかった場合は FileNotFoundException が throw され  
以下のような結果が出力される

```
Java.io.FileNotFoundException: C:\XXXXXXXXXXXXXXXXXXXXXX (指定されたファイルが見つかりません。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at samples.exception.io.FileNotFoundExceptionTest.main(FileNotFoundExceptionTest.java:11)
```

- 実行時に例外が発生した場合は IOException が throw され  
以下のように、どこでどのような例外が発生したのかが出力される

```
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:468)
        at java.lang.Integer.parseInt(Integer.java:518)
        at DivideCalc2.main(DivideCalc2.java:12)
```

### ファイルの書き込み
```java:writeFile.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class WriteFile {
  public static void main(String args[]){
    try {
      File file = new File("c:¥¥tmp¥¥test.txt");

      FileWriter filewriter = new FileWriter(file);

      filewriter.write("こんにちは¥r¥n");
      filewriter.write("お元気ですか¥r¥n");

      filewriter.close();
    } catch(IOException e) {
      System.out.println(e);
    }
  }
}
```

- 上記の fileReader のように、filewriter にはファイルが代入される
- close メソッドが走ること、Exception が投げられることも上記と同様
- write メソッドが実行されると、引数にとっている文字列が該当のファイルに書き込まれる

### ファイルの削除
```java:deleteFile.java
import java.io.File;

class DeleteFile {
  public static void main(String args[]){
    File file = new File("c:¥¥tmp¥¥newfile.txt");

    if (file.delete()){
      System.out.println("ファイルを削除しました");
    } else {
      System.out.println("ファイルの削除に失敗しました");
    }
  }
}
```

- delete メソッドが実行されると、該当のファイルが削除される

### ファイルの名前変更
```java:renameFile.java
import java.io.File;

public class RenameFile {
    import java.io.*;

    public static void main(String[] args) {
        File file1 = new File("c:\\temp\\test.txt");
        File file2 = new File("c:\\temp\\sample\\test.txt");
        try {
            if (file1.renameTo(file2)) {
                System.out.println("移動成功");
            } else {
                System.out.println("移動失敗");
            }
        } catch (SecurityException e) {
            System.out.println("例外が発生しました。");
            System.out.println(e);
        } catch (NullPointerException e) {
            System.out.println("例外が発生しました。");
            System.out.println(e);
        }
    }
}
```

- File 型のオブジェクトで renameTo メソッドを使うと、引数にとった File 型オブジェクトが  
参照するファイル(もしくはディレクトリ)へリネームされる
- 基本的にこのメソッドでは例外が発生しないため、戻り値で確認を取る必要がある

### その他
- File クラスのオブジェクトをディレクトリに割り当てた場合、list メソッドを使うことで  
File クラスのオブジェクトに含まれるファイルやディレクトリの一覧を取得することができる
- mkdir メソッドを使えばディレクトリを作ることができる

<br>

## 文字ストリームとバイトストリーム

### 文字ストリーム: 文字(16ビット)単位の入出力
- 一方バイトストリームとはバイト(8ビット)単位の入出力
- 文字ストリームを使うとプラットホームの文字コードに依存しないプログラムを容易に書ける
- 例えば Java では文字コードとして Unicode が使われているが、 ソースファイルやデータのの文字コードが Unicode でない場合も問題なく使うことができる

### 文字コード変換に関わるクラス
- 文字ストリーム入力用クラスの InputStreamReader は、あるバイト列のコード (shift_JISなど) を Unicode の文字列として読み込める
- 文字ストリーム出力用クラスの OutputStreamReader は、ある Unicode のファイルを Shift_JIS などのバイト列として読み込める
- バイトストリーム入力用クラスの DataInputStream は、byte, short などさまざまな形でファイルを読み込むことができる