経緯
以前、ブログに書いた通り、Filesを使っていた際、MalformedInputExceptionが発生した。
調査した結果を残すことを決意し、ブログを書くのであった。
発生事象
書いたコードは、以下の感じ
Stream<String> stream = Files.lines(Paths.get("aaaa"))
sjisのファイルを読み込ませたら、 MalformedInputException
が発生した。
ちなみに、環境は、Java17。
発生理由
デフォルトのキャラセットだと、UTF-8であるため、ファイルを読み込んだ際にエラーになっていた。
Java18からUTF-8がデフォルトみたいな記事をみたけど、一部の機能は、すでにUTF-8対応されているので、バージョンに注意
Files.linesの実装をみると、以下だった。
public static Stream<String> lines(Path path) throws IOException { return lines(path, UTF_8.INSTANCE); }
linesをオーバーロードしてるだけ。
キャラセットを固定値で渡していたので、SJISの値を渡せば問題解決するってことがすぐに分かった。
対処理由につづく(キートン山田風
対処
UTF-8を指定していたので、そこをSJISに変えてあげるだけ。
ソースは以下の通り。
Stream<String> stream = Files.lines(Paths.get("aaaa", Charset.forName("SJIS")))
分かればなんともないけど、文字コードは、意外とトラップになることが多い。
最初、なんで読み込めないんだ??ってなって、頭の中が疑問符だらけだった。
前に読み込んだファイルと同じファイルだよな~って思って、テキストファイルの中身を見たら、エンコードが違うことに気づいた。
参考サイト
https://teratail.com/questions/40110
https://www.ne.jp/asahi/hishidama/home/tech/java/charset.html