【Java】ファイル読み込み時、MalformedInputExceptionの発生を回避する

ファイル読み込み時、MalformedInputExceptionの発生を回避

今回使用した環境

インターネット接続可能のオンラインの環境

64 ビット オペレーティング システム

Windows 10 22H2

Java 17

MalformedInputExceptionの再現

まずはMalformedInputExceptionを再現させます。

原因としてはFiles.readAllLinesで読み込んだ際、ファイルの中に異なる文字コード ( この場合だとSJIS以外の文字コード ) が含まれていると発生するようです。

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 CharsetTest {

	public static void main(String[] args) {

		// 文字コード指定
		Charset charset = Charset.forName("SJIS");
		
		try {
			// ファイルのパスを取得
			Path path = Paths.get("D:\\開発\\TEST.txt");

			// ファイルの読み込み
			List<String> lineList = Files.readAllLines(path, charset);

			// ファイルの内容を出力
			for (String line : lineList) {
				System.out.println(line);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

読み込むファイルの「TEST.txt」は以下のようになっています。文字コードはSJISのファイルですが、3行目にSJIS以外の文字コードを含ませています。

これで実行するとMalformedInputExceptionが再現できました。

MalformedInputExceptionの回避

どうも「Files.readAllLines」を使用すると発生するよう? ( 他にも発生するケースがあるかどうかはわからないです。)

なので別の方法 ( InputStreamReader ) でファイルを読み込みます。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class CharsetTest {

	public static void main(String[] args) {

		// 文字コード指定
		Charset charset = Charset.forName("SJIS");

		// ファイルの読み込み
		try (FileInputStream fis = new FileInputStream("D:\\開発\\TEST.txt");
				InputStreamReader isr = new InputStreamReader(fis, charset);
				BufferedReader br = new BufferedReader(isr);) {

			// ファイルの内容を出力
			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

これを実行してみると…

以下のようにエラーが発生することなくインプットファイルを読み込めました。当然ですが、3行目のSJIS以外文字コードは文字化けしてますね。

以上となります。

ここまでお読みいただきありがとうございました。

Java

Posted by だゆう