Чтение из файла, содержащего неперемещаемые символы

#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 для чтения файла в виде последовательности байтов и использовать любую эвристику, которую вы считаете подходящей для определения «полезных» частей файла.