Java テキストファイルの読み書き(Filesクラス)

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なしになります。

UTF8のBOM無しと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

関連の記事

Java ファイルの存在/移動/コピー/削除(Filesクラス)

△上に戻る