web-dev-qa-db-ja.com

特定の文字エンコーディングでJavaのファイルを読み取る方法は?

このメソッドの出力に応じて、UTF-8またはWindows-1252としてファイルを読み取ろうとしています。

_public Charset getCorrectCharsetToApply() {
    // Returns a Charset for either UTF-8 or Windows-1252.
}
_

これまでのところ、私は持っています:

_String fileName = getFileNameToReadFromUserInput();
InputStream is = new ByteArrayInputStream(fileName.getBytes());
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);
_

私が抱えている問題は、BufferedReaderインスタンスをFileReaderに変換することです。

さらに:

  • ファイル自体の名前(fileName)は、特定のCharsetであると信頼することはできません。ファイル名にUTF-8文字が含まれることがあり、Windows-1252が含まれることもあります。ファイルのコンテンツについても同じことが言えます(ただし、ファイル名とファイルコンテンツがalwaysに一致する文字セットを持つ場合)。
  • getCorrectCharsetToApply()内のロジックのみが適用する文字セットを選択できるため、名前でファイルを読み取ろうとするとpriorこのメソッドを呼び出すと、Java間違ったエンコーディングでファイル名を読み込もうとしています...

前もって感謝します!

20
IAmYourFaja

そのため、最初に、fileName.getBytes()がファイル自体ではなくファイル名のバイトを取得していることを理解してください。

第二に、 FileReader のドキュメント内を読む:

このクラスのコンストラクタは、デフォルトの文字エンコーディングとデフォルトのバイトバッファサイズが適切であると想定しています。これらの値を自分で指定するには、FileInputStreamでInputStreamReaderを作成します。

だから、FileReaderは実際には行く方法ではないように聞こえます。ドキュメントのアドバイスを利用する場合は、コードを次のように変更する必要があります。

String fileName = getFileNameToReadFromUserInput();
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

fileReaderを作成しようとしないでください。

29
Dennis Meng

Google Guava を使用している場合は、 Files.newReader

final BufferedReader reader =
        Files.newReader(new File(filename), getCorrectCharsetToApply());
4
shadowmatter

Java 7+を使用すると、リーダーを1行で作成できます。

BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());

4
dlauzon