【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以外文字コードは文字化けしてますね。
以上となります。
ここまでお読みいただきありがとうございました。