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

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

3 ответов


Итак, во-первых, как хедз-ап, поймите, что 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 вообще.


обратите внимание, что если вы используете Google Guava, вы можете использовать Files.newReader:

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

С Java 7+, Вы можете создать читателя в одну строку:

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