чтение длинного типа из текстового файла в Java - PullRequest
3 голосов
/ 10 марта 2012

Я пытаюсь прочитать длинные типы из текстового файла с использованием метода 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

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

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)

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

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

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

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

4 голосов
/ 10 марта 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 для сложных случаев. .

3 голосов
/ 10 марта 2012

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

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

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

// 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 .

...