#java #file-io
#java #file-io
Вопрос:
Я пытаюсь использовать File и Scanner для чтения файла .txt и извлечения полезной информации из него в отдельный файл. Некоторые из этих файлов содержат китайские символы, и это приводит к тому, что мой сканер выдает следующую ошибку «java.nio.charset.Исключение UnmappableCharacterException:». Китайские символы не имеют значения, так как мне заставить сканер игнорировать китайские символы и продолжать поиск полезной информации в остальной части файла?
Вот код:
try {
File source = new File(this.parentDirectory File.separator this.fileName.getText());
Scanner reader = new Scanner(source);
StringBuilder str = new StringBuilder();
while (reader.hasNextLine()) {
str.append(reader.nextLine());
str.append("n");
}
if (reader.ioException() != null) {
throw reader.ioException();
}
reader.close();
this.input.setText(str.toString());
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(this, "File not found!");
return;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Ответ №1:
Сканер неявно преобразует между внешней последовательностью байтов и 16-разрядными символами Юникода, используемыми всеми строками Java.
Вам необходимо знать фактическую кодировку, используемую для внешних данных (т. Е. содержимого файла). Затем вы объявляете свой сканер как
Scanner reader = new Scanner(file, charset);
Сделав это правильно, тогда не должно быть «неперемещаемых» символов.
Если вы не укажете кодировку явно, то используется значение по умолчанию платформы, которое, вероятно, является UTF-8.
В качестве альтернативы, кажется, что вы на самом деле не используете сканер в какой-либо значительной степени; вы просто используете его для сбора строк. Вы могли бы понизить уровень и использовать FileInputStream для чтения файла в виде последовательности байтов и использовать любую эвристику, которую вы считаете подходящей для определения «полезных» частей файла.