web-dev-qa-db-ja.com

テキストファイルからの読み取りの最初の文字:

このコードを書くと、これを出力として取得します->これを最初に:ï"¿そして他の行

try {
    BufferedReader br = new BufferedReader(new FileReader(
            "myFile.txt"));

    String line;
    while (line = br.readLine() != null) {
        System.out.println(line);
    }
    br.close();

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

どうすればそれを回避できますか?

13
Milton90

このシーケンスは TF-8バイトオーダーマーク(BOM) であるため、最初の行に文字ï"¿が表示されます。テキストファイルがBOMで始まる場合は、メモ帳などのWindowsプログラムによって生成された可能性があります。

問題を解決するために、デフォルトのシステム文字エンコード(US-ASCIIなど)ではなく、ファイルをUTF-8として明示的に読み取ることを選択します。

BufferedReader in = new BufferedReader(
    new InputStreamReader(
        new FileInputStream("myFile.txt"),
        "UTF-8"));

次に、UTF-8では、バイトシーケンスはU + FEFFである1文字にデコードされます。この文字はオプションです。正規のUTF-8ファイルは、この文字で始まる場合とそうでない場合があります。したがって、U + FEFFの場合にのみ、最初の文字をスキップします。

in.mark(1);
if (in.read() != 0xFEFF)
  in.reset();

これで、残りのコードを続行できます。

19
Nayuki

問題は、使用されるエンコーディングにある可能性があります。これを試して:

BufferedReader in = new BufferedReader(new InputStreamReader(
      new FileInputStream("yourfile"), "UTF-8"));
2
Tala