12億円ほしい人のブログ

メガBIG当たらないかな

Java ファイルの入出力

Pathの取得

Path path = Paths.get("C:\\Users\\username\\Desktop\\sample.txt");

java.nio.file.Pathsクラスを使うとパスのインスタンスを取得できます。

Files#readAllLines ファイルを一度にすべて読み込む

List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for(String line : lines) {
    System.out.println(line);
}

java.nio.file.Filesクラスの readAllLines メソッドを使うとList型で文字列を一挙に取得できます。
・改行記号ごとに別のリスト要素になる
・上のコードだと単純に、取得したファイルの文字列を表示するだけ
・StandardCharsets自体はよくわからないが、とりあえずUTF_8なので注意!(アンダーバー)
・ファイルと異なる文字コードを指定すると当然文字化け
・クローズ処理はいらない(というかない)みたい。
 (クローズ処理が必要なのは、CloseableまたはAutoCloseableを実装しているクラス。)
・省略したけど、IOExceptionのキャッチが必要


Files#lines ファイルを少しずつ読み込む

Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);

Filesクラスのlinesメソッドを使うとStreamとして取得できます。
この場合も行ごとに読み込むみたいです。
readAllLinesとの違いは、
・readAllLine → 一括ですべてを読みこんでListに
・lines    → 少しずつ読み込み、streamが消費されるたびに残りを読み込み
だそうです。

なお、Streamの場合は最後closeが必要です。
ここは、Java7から可能になった、try-with-resources文の出番です

try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)){
    lines.forEach(line -> System.out.println(line));
} catch (IOException e) {
    System.out.println(e);
}


Files#newBufferedWriter ファイルを少しずつ書き込む

BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)

newBufferedWriterメソッドを使うと、BufferedWriterが取得できます。
・パスに指定したファイルへの書き込みができる
・バッファリングにより効率的に書き込み
・デフォルトでは、
  1.パスのファイルが無ければファイルを新規作成して書き込み
  2.あれば、上書きモード
・引数に StandardOpenOption.APPEND を記載すると、追記モード
次のコードだと、
aaa
bbb
ccc
と書き込まれます

List<String> lines = new ArrayList<>();
lines.add("aaa");
lines.add("bbb");
lines.add("ccc");
try (BufferedWriter out = Files.newBufferedWriter(path2, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
    for (String line : lines) {
        out.write(line);
        out.newLine();
    }
} catch (IOException e) {
    System.out.println(e);
}