エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【Java】MalformedInputException: Input length = 1を回避する

経緯

以前、ブログに書いた通り、Filesを使っていた際、MalformedInputExceptionが発生した。

suzaku-tec.hatenadiary.jp

調査した結果を残すことを決意し、ブログを書くのであった。

発生事象

書いたコードは、以下の感じ

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

https://qiita.com/niharu/items/662b130149ee180f7f34