Не могу понять последовательность вывода, используя сканер и FileReader для чтения текстового файла и печати - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь прочитать простой текстовый файл со списком книг с названием книги и автором, разделенными знаком «-». С помощью сканера, чтения файлов и пропуска отделите название книги от автора и распечатайте ее. Я не могу понять поток программы на выходе:

 import java.io.*;
    import java.util.*;

public class FileReaderDemo {

    public static void main(String[] args)  {

        File file = new File("Filepath....>BookList.txt");
        Scanner scan = null;

        try {
                scan = new Scanner(new FileReader(file));
                scan.useDelimiter("-");

                while(scan.hasNext())
                {
                    System.out.println("Book -> "+scan.next());
                    scan.skip(scan.delimiter());
                    System.out.println("Author -> "+scan.next());

                }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        scan.close();       


}
}

Текстовый файл содержит следующее:

Harry Potter & Order of Phoenix - J K Rowling
Autobiography of a Yogi - Parmahansa Yoganand
Alice in Wonderland - Lewis Carroll

Результат выглядит следующим образом:

Book -> Harry Potter & Order of Phoenix 
Author ->  J K Rowling
Autobiography of a Yogi 
Book ->  Parmahansa Yoganand
Alice in Wonderland 
Author ->  Lewis Carroll

Что я не могу понять, так это то, что первая книга печатается нормально, как второе название книги печатается без "Book->" или какого-либо оператора println перед ним, а затем снова печатается третья книга и, наконец, автор с последней часть ?

Ответы [ 2 ]

1 голос
/ 20 июня 2020

С помощью scan.useDelimiter("-") вы токенизируете строки исходного файла без учета символов новой строки.

Я бы изменил подход и использовал метод .nextLine() вместо .next(), а затем разделил строку с .split("-") метод String.

В качестве альтернативы вы можете установить разделитель сканера на

scan.useDelimiter(System.getProperty("line.separator"))
1 голос
/ 20 июня 2020

Когда вы устанавливаете разделитель на -, тогда только - ограничивает токены, символы новой строки - нет, поэтому второй токен - это текст "J K Rowling\nAutobiography of a Yogi".

Если вы хотите разделить как -, так и символы новой строки, используйте регулярное выражение "-|\\R".

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

Демо

String input = "Harry Potter & Order of Phoenix - J K Rowling\r\n" + 
               "Autobiography of a Yogi - Parmahansa Yoganand\r\n" + 
               "Alice in Wonderland - Lewis Carroll\r\n";
try (Scanner scan = new Scanner(input)) {
    scan.useDelimiter("\\s*-\\s*|\\s*\\R");
    while (scan.hasNext()) {
        System.out.println("Book -> " + scan.next());
        System.out.println("Author -> " + scan.next());
    }
}

Вывод

Book -> Harry Potter & Order of Phoenix
Author -> J K Rowling
Book -> Autobiography of a Yogi
Author -> Parmahansa Yoganand
Book -> Alice in Wonderland
Author -> Lewis Carroll
...