Java（jdk1.8以降）のファイル入出力のサンプルプログラム

Javaの（jdk1.8以降）のファイル入出力のサンプルプログラムのメモです。

# 1. バイナリファイルの読み込み

### 1.1. 一括読み込み

`C:/dk/input.xlsx`を一括で読み込み、16進数で標準出力に出力するサンプルプログラムです。
一括で読み込む場合、Outofmemoryにならないようサイズに注意する必要があります。

```java:BinaryFileInputNio.java
package test.nio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * バイナリーファイルを読み込む
 */
public class BinaryFileInputNio {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 読み込みファイルの名前
		Path path = Paths.get("C:/dk", "input.xlsx");

		try {
			
			// バイナリファイル一括読み込み
			byte[] data = Files.readAllBytes(path);
			
			// 読み込んだバイナリデータを16進数で標準出力に出力
			for (int i = 0; i < data.length; i++) {
				System.out.printf("%02x ", data[i]);
			}
			System.out.println();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

### 1.2. 分割読み込み

`C:/dk/input.xlsx`を1024バイト単位で読み込み、16進数で標準出力に出力するサンプルプログラムです。

```java:BinaryFileInputNioPart.java
package test.nio;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * バイナリーファイルを読み込む
 */
public class BinaryFileInputNioPart {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 読み込みファイルの名前
		Path path = Paths.get("C:/dk", "input.xlsx");

		// 入力ストリームの生成
		try (InputStream inst = Files.newInputStream(path)) {

			// 読み込み用バイト配列
			byte[] buf = new byte[1024];

			int len = 0;
			// 入力ストリームからの読み込み（ファイルの読み込み）
			while ((len = inst.read(buf)) != -1) {

				// 読み込んだバイナリデータを16進数で標準出力に出力
				for (int i = 0; i < len; i++) {
					System.out.printf("%02x ", buf[i]);
				}
				System.out.println();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

# 2. バイナリファイルの書き込み

### 2.1. 一括書き込み

バイナリデータを`C:/dk/output.dat`に一括で書き込むサンプルプログラムです。

```java:BinaryFileOutputNio.java
package test.nio;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * バイナリーファイルを書き込む
 */
public class BinaryFileOutputNio {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 書き込みファイルの名前
		Path path = Paths.get("C:/dk", "output.dat");

		// バイナリデータ
		byte[] data = { (byte)0xe3, (byte)0x83, (byte)0x86, (byte)0xe3, (byte)0x82, (byte)0xad, (byte)0xe3, (byte)0x82, (byte)0xb9, (byte)0xe3, (byte)0x83, (byte)0x88, (byte)0xe3, (byte)0x83, (byte)0x95, (byte)0xe3, (byte)0x82, (byte)0xa1, (byte)0xe3, (byte)0x82, (byte)0xa4, (byte)0xe3, (byte)0x83, (byte)0xab, (byte)0xe5, (byte)0x87, (byte)0xba, (byte)0xe5, (byte)0x8a, (byte)0x9b, (byte)0x30, (byte)0x31, (byte)0x0d, (byte)0x0a, (byte)0xe3, (byte)0x83, (byte)0x86, (byte)0xe3, (byte)0x82, (byte)0xad, (byte)0xe3, (byte)0x82, (byte)0xb9, (byte)0xe3, (byte)0x83, (byte)0x88, (byte)0xe3, (byte)0x83, (byte)0x95, (byte)0xe3, (byte)0x82, (byte)0xa1, (byte)0xe3, (byte)0x82, (byte)0xa4, (byte)0xe3, (byte)0x83, (byte)0xab, (byte)0xe5, (byte)0x87, (byte)0xba, (byte)0xe5, (byte)0x8a, (byte)0x9b, (byte)0x30, (byte)0x32, (byte)0x0d, (byte)0x0a};

		try {
			// バイナリデータ一括書き込み
			Files.write(path, data);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```


### 2.2. 分割書き込み

バイナリデータを`C:/dk/output.dat`に分割で書き込むサンプルプログラムです。

```java:BinaryFileOutputNioPart.java
package test.nio;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * バイナリーファイルを書き込む
 */
public class BinaryFileOutputNioPart {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 書き込みファイルの名前
		Path path = Paths.get("C:/dk", "output.dat");

		// バイナリデータ
		byte[] data1 = { (byte)0xe3, (byte)0x83, (byte)0x86, (byte)0xe3, (byte)0x82, (byte)0xad, (byte)0xe3, (byte)0x82, (byte)0xb9, (byte)0xe3, (byte)0x83, (byte)0x88, (byte)0xe3, (byte)0x83, (byte)0x95, (byte)0xe3, (byte)0x82, (byte)0xa1, (byte)0xe3, (byte)0x82, (byte)0xa4, (byte)0xe3, (byte)0x83, (byte)0xab, (byte)0xe5, (byte)0x87, (byte)0xba, (byte)0xe5, (byte)0x8a, (byte)0x9b, (byte)0x30, (byte)0x31, (byte)0x0d, (byte)0x0a};
		byte[] data2 = { (byte)0xe3, (byte)0x83, (byte)0x86, (byte)0xe3, (byte)0x82, (byte)0xad, (byte)0xe3, (byte)0x82, (byte)0xb9, (byte)0xe3, (byte)0x83, (byte)0x88, (byte)0xe3, (byte)0x83, (byte)0x95, (byte)0xe3, (byte)0x82, (byte)0xa1, (byte)0xe3, (byte)0x82, (byte)0xa4, (byte)0xe3, (byte)0x83, (byte)0xab, (byte)0xe5, (byte)0x87, (byte)0xba, (byte)0xe5, (byte)0x8a, (byte)0x9b, (byte)0x30, (byte)0x32, (byte)0x0d, (byte)0x0a};

		// バイナリデータ書き込み
		try (OutputStream os = Files.newOutputStream(path)) {
			os.write(data1);
			os.write(data2);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

# 3. テキストファイルの読み込み

### 3.1. 一括読み込み

`C:/dk/input.txt`を一括で読み込み、標準出力に出力するサンプルプログラムです。
一括で読み込む場合、Outofmemoryにならないようサイズに注意する必要があります。

```java:TextFileInputNio.java
package test.nio;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * テキストファイルの読み込み
 */
public class TextFileInputNio {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 読み込みファイルの名前
		Path path = Paths.get("C:/dk", "input.txt");

		try {

			// テキストファイルを一括読み込み
			List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);

			// 読み込んだテキストファイルを標準出力に出力
			lines.forEach(line -> System.out.println(line));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

### 3.2. 分割読み込み（BufferedReaderを使用）

`C:/dk/input.txt`をBufferedReaderで読み込み、標準出力に出力するサンプルプログラムです。

```java:TextFileInputNioPart1.java
package test.nio;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * テキストファイルの読み込み
 */
public class TextFileInputNioPart1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 読み込みファイルの名前
		Path path = Paths.get("C:/dk", "input.txt");

		// BufferedReaderの生成
		try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {

			String msg;

			// テキストファイルからの読み込み
			while ((msg = br.readLine()) != null) {

				// 標準出力に出力
				System.out.println(msg);

			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

### 3.3. 分割読み込み（Streamを使用）

`C:/dk/input.txt`をStreamで読み込み、標準出力に出力するサンプルプログラムです。

```java:TextFileInputNioPart2.java
package test.nio;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

/**
 * テキストファイルの読み込み
 */
public class TextFileInputNioPart2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 読み込みファイルの名前
		Path path = Paths.get("C:/dk", "input.txt");

		// Streamの生成
		try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {

			// 標準出力に出力
			lines.forEach(line -> System.out.println(line));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

# 4. テキストファイルの書き込み

### 4.1. 書き込み（BufferedWriterを使用）

BufferedWriterを使用して、テキストデータを`C:/dk/output.txt`に書き込むサンプルプログラムです。

```java:TextFileOutputNio1.java
package test.nio;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * テキストファイルへの書き込み
 */
public class TextFileOutputNio1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 書き込みファイルの名前
		Path path = Paths.get("C:/dk", "output.txt");

		// BufferedWriterの生成
		try (BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {

			// ファイルへの書き込み
			for (int i= 1; i <= 2; i++) {
				bw.write("テキストファイル出力" + String.format("%02d", i));
				bw.newLine();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```


### 4.2. 書き込み（PrintWriterを使用）

PrintWriterを使用して、テキストデータを`C:/dk/output.txt`に書き込むサンプルプログラムです。

```java:TextFileOutputNio2.java
package test.nio;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * テキストファイルへの書き込み
 */
public class TextFileOutputNio2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 書き込みファイルの名前
		Path path = Paths.get("C:/dk", "output.txt");

		try (
			// PrintWriterの生成
			BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8);
			PrintWriter pw = new PrintWriter(bw);
		) {
			// ファイルへの書き込み
			for (int i= 1; i <= 2; i++) {
				pw.println("テキストファイル出力" + String.format("%02d", i));
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

---

以上