Как читать файл в 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. То же самое касается содержимого файла (однако, если имя файла и содержимое файла всегда будут иметь соответствующие кодировки).
- Только логика внутри
getCorrectCharsetToApply()
может выбрать кодировку для применения, поэтому попытка прочитать файл по его имени до вызова этого метода может привести к тому, что Java попытается прочитать имя файла с неправильной кодировкой. который заставляет его умереть!
Спасибо заранее!
Ответы
Ответ 1
Итак, во-первых, как хэдз-ап, поймите, что fileName.getBytes()
, поскольку у вас там есть байты имени файла, а не самого файла.
Во-вторых, чтение внутри документов FileReader:
Конструкторы этого класса предполагают, что символ по умолчанию кодирование и размер байта по умолчанию. Указать эти значения самостоятельно, постройте InputStreamReader на FileInputStream.
Итак, звучит как FileReader, на самом деле это не путь. Если мы примем совет в документах, вам следует просто изменить свой код:
String fileName = getFileNameToReadFromUserInput();
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);
а не пытаться сделать FileReader вообще.
Ответ 2
Обратите внимание: если вы используете Google Guava, вы можете использовать Files.newReader
:
final BufferedReader reader =
Files.newReader(new File(filename), getCorrectCharsetToApply());
Ответ 3
С помощью Java 7+ вы можете создать Reader в одной строке:
BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());