Как читать файл на 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());