JavaのFilesクラスのメソッドでテキストファイルを読み書きするサンプルです。
(確認環境:Java8)
目次
サンプル | ファイルを読み込む(Files.readAllLines) |
サイズが大きいファイルを読み込む(Files.lines) | |
ファイルに書き込む(Files.write) | |
文字コードの指定でStandardCharsetsを使う場合 |
ファイルを読み込む(Files.readAllLines)
public static List<String> readAllLines(Path path,Charset cs) throws IOException |
Filesクラスは、JDK1.7で導入されました。
テキストファイルを読み込みEclipseのコンソールに1行ずつ表示します。
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
//Path path1 = Paths.get("D:\\Test1","test1.txt"); //引数2つ
Path path1 = Paths.get("D:\\Test1\\\\test1.txt"); //引数1つ
//Charset charset = Charset.forName("MS932"); //文字コード
Charset charset = Charset.forName("UTF-8"); //文字コード
try {
List<String> line = Files.readAllLines(path1,charset);
for (String s : line) {
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
パスを取得する
10,11行目は、ファイルのある場所(パス)を指定しています。どちらでも可です。
10行目は、引数がフォルダとファイルで分かれています。
11行目は、引数がフォルダとファイルの1つになっています。
文字コード
13行目のMS932は、MS932≒shift_jisです。
CharsetクラスのforNameメソッドで指定できる主な文字コードとして以下があります。
MS932、SJIS、Shift_JIS、UTF-8
文字コードの指定は、StandardCharsetsでも可能です。
ファイルの読み込み
17行目のreadAllLinesは、引数はパスと文字コードの2つです。
引数がパスのみの場合、文字コードはデフォルトでUTF-8になります。
17行目で全ての文字を読み込みStringのリストを返し18行目のfor文で出力しています。
※すべての文字を読み込むことによりメモリを大量に使う可能性があるので注意が必要です。
ファイルのサイズが大きい場合は、Stream APIを使うFiles.linesを使用します。
Files.readAllLinesはclose不要です。
実行結果
実行するとテキストファイルを読み込みEclipseのコンソールに1行ずつ表示します。
テキストファイル
コンソール
Java8 API仕様のFiles.readAllLinesのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#readAllLines-java.nio.file.Path-java.nio.charset.Charset-
以下は、OracleのCharsetクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/charset/Charset.html
サイズが大きいファイルを読み込む(Files.lines)
public static Stream<String> lines(Path path,Charset cs) throws IOException |
Filesクラスは、JDK1.7で導入されました。
Files.linesは、ファイル内の行をStreamとして読み取ります。
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class Test1 {
public static void main(String[] args) {
Path path1 = Paths.get("D:\\Test1","test1.txt"); //path
Charset charset = Charset.forName("UTF-8"); //文字コード
try (Stream<String> stream = Files.lines(path1,charset)) {
stream.forEach(line -> {
System.out.println(line);
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
Files.linesはcloseが必要ですがtry-with-resources文にすればcloseの記述は不要です。
Java リソースを自動でクローズ(try-with-resources文)
Java8 API仕様のFiles.linesのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#lines-java.nio.file.Path-java.nio.charset.Charset-
ファイルに書き込む(Files.write)
public static Path write(Path path,Iterable<? extends CharSequence> lines,Charset cs,OpenOption... options) throws IOException |
Filesクラスは、JDK1.7で導入されました。
テキストファイルに書き込むサンプルです。
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
//Path path1 = Paths.get("D:\\Test1","test1.txt"); //パス
Path path1 = Paths.get("D:\\Test1\\\\test1.txt"); //パス
//Charset charset = Charset.forName("MS932"); //文字コード
Charset charset = Charset.forName("UTF-8"); //文字コード
List<String> list = new ArrayList<>(Arrays.asList("赤","黄","青"));
try {
Files.write(path1,list,charset,
StandardOpenOption.TRUNCATE_EXISTING); //新規書き込み
} catch (IOException e) {
e.printStackTrace();
}
}
}
パスを取得する
13,14行目は、ファイルのある場所(パス)を指定しています。どちらでも可です。
13行目は、引数がフォルダとファイルで分かれています。
14行目は、引数がフォルダとファイルの1つになっています。
文字コード
16行目のMS932は、MS932≒shift_jisです。
CharsetクラスのforNameメソッドで指定できる主な文字コードとして以下があります。
MS932、SJIS、Shift_JIS、UTF-8
UTF-8の指定はBOMなしになります。
文字コードの指定は、StandardCharsetsでも可能です。
ファイルの書き込み
22,23行目は、ファイルに新規で書き込んでいます。対象のファイルがない場合はエラーになります。
Files.writeは、Java7で導入されたjava.nio.file.FilesクラスのメソッドでNIO.2とも呼ばれます。
似た名前でFileクラス(java.io.File)がありますがそれとは別です。
4つめの引数はオプションで新規書込みまたは追記書込みを指定します。
StandardOpenOption.TRUNCATE_EXISTING | 新規書き込み |
StandardOpenOption.APPEND | 追記書き込み |
実行結果
リストの要素ごと改行されます。
Java8 API仕様のFiles.writeのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption...-
以下は、OracleのCharsetクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/charset/Charset.html
文字コードの指定でStandardCharsetsを使う場合
public final class StandardCharsets extends Object |
StandardCharsetsでも文字コードを指定できます。
ただしSJISの指定はできません。
StandardCharsetsを使用したサンプルです。
package test1;
import java.io.IOException;
import java.nio.charset.Charset;
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 Test1 {
public static void main(String[] args) {
Path path1 = Paths.get("D:\\Test3","test2.txt");
Charset charset = StandardCharsets.UTF_8;
try {
List<String> line = Files.readAllLines(path1,charset);
for (String s : line) {
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
14行目は、StandardCharsetsでUTF-8を指定しています。
以下は、OracleのStandardCharsetsクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/nio/charset/StandardCharsets.html
関連の記事