Java - проблемы с чтением txt.file - PullRequest
1 голос
/ 05 ноября 2011

Я создал метод для чтения файла в Java. Данный файл содержит список книг в следующем формате: фамилия | имя | название. Однако, когда я пытаюсь использовать метод, я получаю сообщение об ошибке. Мой метод заключается в следующем:

private final static char END_SIGN = '|';

void readBookFile(String readFile) {
        try {
            FileReader textFileReader = new FileReader(readFile);
            BufferedReader textReader = new BufferedReader(textFileReader);

            int numberOfBooks = Integer.parseInt(textReader.readLine());

            for (int i = 0; i < numberOfBooks; i++) {
                String post = textReader.readLine();

                int index1 = post.indexOf(END_SIGN);
                int index2 = post.indexOf(END_SIGN, index1 + 1);

                String lastname = post.substring(0, index1);
                String firstname = post.substring(index1 + 1, index2);
                String title = post.substring(index2 + 1);

                Book book = new Book(lastname, firstname, title);

                addBook(book);
            }

            tekstReader.close();
        }
        catch (IOException exception) {
            System.out.print("Wrong file reading: " + exception);
            System.exit(1);
        }
    }

Когда я пытаюсь запустить этот метод, я получаю сообщение об ошибке:

Exception in thread "main" java.lang.NumberFormatException: For input string: "Twain|Mark|The Adventures of Huckleberry Finn"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Library.readBookFile(Library.java:36)
    at LibraryTest.main(LibraryTest.java:8)

Строка 36 - это часть метода, где я идентифицирую целое число книг. Очевидно, что по какой-то причине это не работает. Если кто-нибудь знает, что может вызвать это, я был бы очень признателен!

Ответы [ 8 ]

5 голосов
/ 05 ноября 2011
int numberOfBooks = Integer.parseInt(textReader.readLine());

readLine() здесь возвращает текст первой строки текстового файла.Эта первая строка выглядит как Twain|Mark|The Adventures of Huckleberry Finn, а не как количество книг в файле.

Что вы ожидали от первой строки файла?

4 голосов
/ 05 ноября 2011

Строка, в которой вы читаете, не является числом.Это название книги, поэтому, когда она пытается прочитать ее как число, она выдает ошибку.Когда вы смотрите на свой входной файл, уверены ли вы, что он начинается с количества строк, за которыми следует следовать?

4 голосов
/ 05 ноября 2011

Очевидно, что первая строка вашего файла не число - это строка, которая отображается в сообщении об ошибке.Вам нужно проверить свой файл.

Несколько других заметок:

  • Обычно вы должны закрыть свой ридер в finally блоке
  • Вы должны почти Никогда не использует кодировку по умолчанию для платформы, которая является единственной поддержкой FileReader, что делает его в основном бесполезным типом.Вместо этого создайте FileInputStream и оберните его в InputStreamReader, указав кодировку.

Guava делает все это проще с помощью класса Files:

List<String> lines = Files.readLines(new File(readFile), Charsets.UTF_8);
// All the IO is now done...
3 голосов
/ 05 ноября 2011

Вместо этого кода:

int numberOfBooks = Integer.parseInt(textReader.readLine());

for (int i = 0; i < numberOfBooks; i++) {
    String post = textReader.readLine();

    int index1 = post.indexOf(END_SIGN);
    int index2 = post.indexOf(END_SIGN, index1 + 1);

    String lastname = post.substring(0, index1);
    String firstname = post.substring(index1 + 1, index2);
    String title = post.substring(index2 + 1);

    Book book = new Book(lastname, firstname, title);

    addBook(book);
}

Попробуйте это:

String post = textReader.readLine();
while (post != null) {
    int index1 = post.indexOf(END_SIGN);
    int index2 = post.indexOf(END_SIGN, index1 + 1);

    String lastname = post.substring(0, index1);
    String firstname = post.substring(index1 + 1, index2);
    String title = post.substring(index2 + 1);

    Book book = new Book(lastname, firstname, title);

    addBook(book);
    post = textReader.readLine();
}

Кроме того, как предлагает Джон Скит, вы должны изменить свой код, чтобы гарантировать, что вход закрыт, даже еслиобработка ввода вызывает исключение.(Конструкция try ... finally хороша для этого.)

2 голосов
/ 05 ноября 2011

Ошибка уже говорит об этом: вы не можете создать целое число из строки: «Твен | Марк | Приключения Гекльберри Финна»: это не числовое выражение.

2 голосов
/ 05 ноября 2011

Код предполагает, что файл начинается с целого числа, количества книг, одного в первой строке.Видимо, этого нет в вашем файле данных.

1 голос
/ 05 ноября 2011

Учитывая, что «рассматриваемый файл содержит список книг в следующем формате: фамилия | имя | название.»

Когда перед циклом for вы пытаетесь int numberOfBooks = Integer.parseInt(textReader.readLine());, это вызывает исключение, потому что он не может преобразовать | разделенная строка на целое число.

Предполагая, что 1 книга на строку, количество книг - это общее количество строк ...

1 голос
/ 05 ноября 2011
int numberOfBooks = Integer.parseInt(textReader.readLine());

строка, которую textReader.readLine () возвращает (String), не является числом, так как она возвращает:

"Twain|Mark|The Adventures of Huckleberry Finn"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...