чтение длинного типа из текстового файла в Java

я пытаюсь прочитать длинные типы из текстового файла с использованием метода readLine() класса BufferedReader, а затем я анализирую первый токен (который является номером длинного типа) с использованием StringTokenizer, но я сталкиваюсь с ошибкой исключения, которая является java.lang.NumberFormatException

это пример моего текстового файла;

2764841629  Quaroten Ilen
1398844030  Orden Nenama
1185252727  Inja Nenaptin
2370429126  Quaren Inaja
1502141743  Otin Una
1993687334  Quarwennaja Nenoten
1015934104  Polen Meritna
2363674760  Otja Ie
1904629749  Neninin Ordja
3047965620  Algnaja Nenja

вот код, который я прочитал из текстового файла и присвоил длинное значение моей длинной переменной

private void registerData() throws FileNotFoundException{
    try {

        String regPatName;
        String regPatSurname;
        long regPatID;


        FileInputStream fis = new FileInputStream("src\\assignment_3\\injuredPersonList.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(fis));

        String line;

        while( ( line = reader.readLine() ) != null) {

            StringTokenizer st = new StringTokenizer(line, " ");

            while(st.hasMoreTokens()){

                regPatID = Long.parseLong(st.nextToken());
                regPatName = st.nextToken();
                regPatSurname = st.nextToken();

                Patient regPatient = new Patient(regPatName, regPatSurname, regPatID);
                hashMethod(regPatient);
            }

        }
    } catch (IOException ex) {
        Logger.getLogger(personTest.class.getName()).log(Level.SEVERE, null, ex);
    }


}

private void hashMethod(Patient regPatient){

    Long idPat = new Long(regPatient.getPatientID());
    int keyID;

    keyID = (int) Math.sqrt(Integer.parseInt(idPat.toString().substring(0, 5) + idPat.toString().substring(5, 10))) % (50000);

    System.out.println(keyID);

}

и, наконец, это ошибка, с которой я столкнулся;

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "2481765933   Otna"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:419)
    at java.lang.Long.parseLong(Long.java:468)
    at assignment_3.personTest.registerData(personTest.java:58)
    at assignment_3.personTest.<init>(personTest.java:33)
    at assignment_3.personTest$1.run(personTest.java:161)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

я буду очень признателен, если вы можете мне помочь, а также спасибо в любом случае.


person quartaela    schedule 10.03.2012    source источник
comment
Пожалуйста, опубликуйте всю полученную трассировку стека. Кроме того, хорошей идеей может быть предоставление образца текстового файла.   -  person Jeffrey    schedule 10.03.2012
comment
хорошо, я немедленно отредактирую свой пост   -  person quartaela    schedule 10.03.2012
comment
Вкладка вашего входного файла случайно не отделена? Символ табуляции != символ пробела. Попробуйте инициализировать токенизатор строк без указания разделителя. (По умолчанию все пробелы.)   -  person biziclop    schedule 10.03.2012
comment
убедитесь, что вы передаете правильное поле в Long.parseLong(). System.out.println(st.nextToken())   -  person Jay    schedule 10.03.2012
comment
@biziclop спасибо за совет, но теперь он выдает java.lang.NumberFormatException: для входной строки: 2481765933   -  person quartaela    schedule 10.03.2012
comment
@Jay да, я прохожу правильное поле.   -  person quartaela    schedule 10.03.2012


Ответы (3)


Вероятно, у вас есть символ табуляции вместо пробелов для разделения полей. Добавьте вкладку в свой набор разделителей (" \t").

Кроме того, всегда закрывайте свои потоки и считыватели в блоке finally (закрывать должен только самый внешний: закрытие BufferedReader закроет InputStreamReader, который закроет FileInputStream).

person JB Nizet    schedule 10.03.2012
comment
спасибо за предложение, но ничего не изменилось, за исключением того, что он выдает java.lang.NumberFormatException: для входной строки: 2481765933. входная строка больше не содержит другой токен - person quartaela; 10.03.2012
comment
Эта строка является допустимым длинным представлением, и я без проблем разбираю ее. Вы уверены, что он не содержит странного символа, который выглядел бы как цифра ASCII, но таковой не является? - person JB Nizet; 10.03.2012
comment
хорошо, это дает ошибку, когда он читает первую строку. я проверяю первую тысячу строк на наличие странного символа, но нет. - person quartaela; 10.03.2012
comment
Добавьте этот фрагмент в свой код: String s = st.nextToken(); for (char c : s.toCharArray()) {System.out.print(" " + (int) c);} System.out.println(); regPatID = Long.parseLong(s); и сообщите нам, что печатается непосредственно перед тем, как будет выдано исключение. - person JB Nizet; 10.03.2012
comment
это дает 50 52 56 49 55 54 53 57 51 51 и exception is Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Otna" - person quartaela; 10.03.2012
comment
и это моя первая строчка 2481765933 Otna Orda - person quartaela; 10.03.2012
comment
Вы пытаетесь разобрать Отну так долго. Вы уверены, что заменили regPatID = Long.parseLong(st.nextToken(); на regPatID = Long.parseLong(s);? - person JB Nizet; 10.03.2012
comment
Я думаю, мы ищем не в том месте, потому что я пытался просто прочитать и напечатать числа в txt, и это сработало. так что нет проблем с синтаксическим анализом чтения и т. д., но в основном коде, который я разместил, я передаю объект в hashMethod(), я думаю, проблема есть, но я не мог ее найти, все кажется в порядке_? - person quartaela; 10.03.2012
comment
Итак, если я правильно понимаю, добавление табуляции в качестве разделителя устранило исходную проблему, но теперь у вас есть исключение в другой части кода. - person JB Nizet; 10.03.2012
comment
Я уверен, что проблема в hashMethod(Patient regPatient), потому что когда я удаляю код, который я называю hashMethod(), все работает идеально! - person quartaela; 10.03.2012
comment
Затем исследуйте. Внимательно прочитайте сообщение об исключении и используйте отладчик или трассировки в коде, чтобы обнаружить, что не так. - person JB Nizet; 10.03.2012
comment
Ну, наконец, я понял, что использую парсер Integer в hashMethod, и эта глупая вещь заняла у меня 2 часа, чтобы понять ... пффф. кстати спасибо за помощь. - person quartaela; 10.03.2012

Очевидно, вы пытаетесь проанализировать нечисловую строку, трассировка стека показывает это: 2481765933 Otna. Вы должны разделить ввод и проанализировать числовую часть, что-то вроде этого:

String[] data = line.split("\\s+");
regPatID = Long.parseLong(data[0]);
regPatName = data[1];
regPatSurname = data.length == 3 ? data[2] : "";

Вышеупомянутое намного проще, чем использование StringTokenizer. Фактически, использование StringTokenizer не рекомендуется, практически не рекомендуется - в настоящее время предпочтительный способ анализа строка либо использует метод split() для простых случаев, либо класс Scanner для сложных случаев.

person Óscar López    schedule 10.03.2012
comment
но я использую этот метод синтаксического анализа много раз, когда читаю целочисленное значение, например, когда у меня есть строка 21321 otna. я думаю, единственная проблема связана с длинными типами - person quartaela; 10.03.2012

Вы используете неправильный разделитель (" "), так как ваш текстовый файл может содержать более одного пробела между токенами. StringTokenizer — это устаревший класс, не используйте его, если у вас нет веской причины. String.split () должно быть достаточно:

String[] result = line.split("\\s+");
regPatID = Long.parseLong(result[0]);
regPatName = result[1];
regPatSurname = result[2];

Но я думаю, что лучше всего подходит Scanner. для вашей проблемы:

// Java 7 try-with-resources synthax.
// If you are using Java <=6, declare a finally block after the catch 
// to close resources.
try (InputStream myFile = ClassLoader.getSystemResourceAsStream("MyTextFile.txt");
        Scanner sc = new Scanner(myFile)) {

    while (sc.hasNext()) {
        regPatID = sc.nextLong();
        regPatName = sc.next();
        regPatSurname = sc.next();

        System.out.printf("%d - %s %s\n", regPatID, regPatName, regPatSurname);
    }

} catch (Exception e) {
    // Do something about exceptions
}

Обе версии правильно анализируют ввод вашего примера.

Вот третья полностью рабочая версия Java 6.

person Anthony Accioly    schedule 10.03.2012
comment
хорошо, когда я распечатываю результат [0] и regPatID, он печатает истинное значение, но снова я сталкиваюсь с той же глупой ошибкой. я имею в виду, что он действительно назначает, но я не знаю, почему я снова получаю ту же ошибку. - person quartaela; 10.03.2012
comment
приятель, я решил проблему 5 минут назад о том, что я использовал Integer.parseInt() в hashMethod(), как вы можете видеть в моем вопросе. и да, это тоже работает правильно, и спасибо за вашу помощь - person quartaela; 10.03.2012
comment
Привет, quartaela, я рад быть полезным, так как вы поняли это, вы должны принять ответы @JB Nizet или Óscar López, чтобы вознаградить их, помогая вам с вашим первоначальным вопросом;). - person Anthony Accioly; 10.03.2012