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); }