Диагностика ошибки Integer.parseInt()

#java #parsing

#java #синтаксический анализ

Вопрос:

Я читаю текст с разделителями в канале из плоского файла, и у меня возникает ошибка при разборе текста. Я старый специалист по Java, но я не прикасался к нему в течение нескольких лет. Вот код:

         String zipString = tokenizerForOneLine.nextToken();
        System.out.println( "Zip String: -->"   zipString   "<--");
        //zipString = "18103"; <<<This works!!!
        int zipInt = Integer.parseInt( zipString );
        aProvider.setZipCode( zipInteger );
  

Вот результат:

 Zip String: -->�18103�<--
java.lang.NumberFormatException: For input string: "�1�8�1�0�3�"
NumberFormatException while reading file.
Detailed Message: For input string: "�1�8�1�0�3�"
  

Я наивно предполагаю, что это проблема с кодировкой. Возможно ли это? Для меня это не имеет смысла. Или я делаю что-то действительно глупое и просто не вижу этого?

Как мне диагностировать проблему с кодировкой? (Мой поставщик данных утверждает, что он находится в стандартном ЮНИКОДЕ).

Заранее спасибо,

Guido

Комментарии:

1. Ну, это странно. После того, как StackOverflow обработал ее, она показала целую кучу странных вопросительных знаков. Теперь я действительно думаю, что это кодировка. Эти вопросительные знаки не отображаются на стандартном выводе (в Netbeans 7.01).

2. Похоже, вы правы, сэр..

3. @GuidoAnselmi: Как всегда, чтобы проверить проблемы с кодировкой, посмотрите на текстовый файл в двоичном редакторе (или hexdump или что-то еще). Я предполагаю, что это UTF-16.

Ответ №1:

Убедитесь, что вы создаете программу чтения с правильной кодировкой. Ваш код должен выглядеть так:

     BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("data.csv"), encoding));
    String line;
    while ((line = in.readLine()) != null) {
        StringTokenizer tokenizer = new StringTokenizer(line, "|");

        ...
    }
  

Кодировка, вероятно, UTF-16.

Кроме того, если файл имеет метки порядка байтов, вы можете использовать BOMInputStream из Commons IO для автоматического определения кодировки.

http://commons.apache.org/io/api-release/org/apache/commons/io/input/BOMInputStream.html