Как читать файл в Java с определенной кодировкой символов? - программирование
Подтвердить что ты не робот

Как читать файл в 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 попытается прочитать имя файла с неправильной кодировкой. который заставляет его умереть!

Спасибо заранее!

4b9b3361

Ответ 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());