このメソッドの出力に応じて、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間違ったエンコーディングでファイル名を読み込もうとしています...前もって感謝します!
そのため、最初に、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を作成しようとしないでください。
Google Guava を使用している場合は、 Files.newReader
:
final BufferedReader reader =
Files.newReader(new File(filename), getCorrectCharsetToApply());
Java 7+を使用すると、リーダーを1行で作成できます。
BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());