Java StreamAPIやってみる

サンプルコード

Java8で追加されたStreamApiを使用してファイルの読み込みと書き出しを行ってみました。

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

/**
 * Streamのサンプル<br />
 * 文字コードはUTF-8で設定(Shift_jisでは参照不可)
 */
public class SampleStream {
	/** 読込パス */
	private static final String INPUT_PATH = "C:\\temp\\in.txt";
	/** 出力パス */
	private static final String OUTPUT_PATH = "C:\\temp\\out.txt";

	public static void main(String[] args) throws Exception {
		// FileSystemを取得
		FileSystem fs = FileSystems.getDefault();
		// ファイルのパスを設定
		Path path = fs.getPath(INPUT_PATH);
		// 出力用のパスを設定
		Path out = fs.getPath(OUTPUT_PATH);

		// 読み込み方その1
		// Files.linesを使用して読み込む
		try (Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8)) {
			stream.filter(s -> s.contains("link")).map(s -> s.replace("html", "form"))
					.map(s -> s.replace("action", "href")).forEach(System.out::println);
		} catch (IOException e) {
			System.out.println("error");
		}

		// 読み方その2
		// Files.readAllLinesを使用して読み込む
		List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
		List<String> output = new ArrayList<String>();
		lines.stream().filter(s -> s.contains("link")).forEach(s -> output.add(s));

		// 抽出したデータをListに詰めてテキストに出力
		Files.write(out, output, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

		// 出力したデータを拡張for文で出力して確認
		for (String put : output) {
			System.out.println(put);
		}
	}

}