28

このメソッドの出力に応じて、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 が含まれることもあります。ファイルの内容についても同様です (ただし、ファイル名とファイルの内容が常に一致する文字セットを持つ場合)。
  • getCorrectCharsetToApply()適用する文字セットを選択できるのは内部のロジックのみであるため、このメソッドを呼び出すにその名前でファイルを読み取ろうとすると、Java が間違ったエンコーディングでファイル名を読み取ろうとする結果が生じる可能性があります。 !

前もって感謝します!

4

3 に答える 3

31

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を作成しようとしないでください。

于 2012-08-23T17:30:02.303 に答える
6

Java 7 以降では、リーダーを 1 行で作成できます。

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

于 2017-10-25T21:05:47.890 に答える
4

Google Guavaを使用している場合は、次を使用できることに注意してFiles.newReaderください。

final BufferedReader reader =
        Files.newReader(new File(filename), getCorrectCharsetToApply());
于 2015-07-15T00:40:03.310 に答える