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

У меня есть несколько классов, предназначенных для моделирования каталога книг. У меня есть класс книги (isbn, title и т.д.), Класс BookNode, BookCatalog, который является LinkedList книг и классами драйверов (gui). Моя проблема в том, что у меня есть метод toString() в BookCatalog, который должен возвращать строковое представление всех книг. Класс Book также переопределяет toString(). Я должен иметь каждое поле книги, разделенное "вкладкой", и каждой книгой, разделенной "новой строкой". Когда я пытаюсь использовать PrintStream для печати каталога книг в .txt файле, \n не регистрируется.

Я попытался изменить его на System.getProperty(line.separator), который правильно отображает книжный каталог. Но теперь у меня проблема, когда сканер не будет правильно читать файл и выбрасывает "NoSuchElementException". Как получить сканер для 1) Игнорировать строку.сепаратор или 2) использовать printStream\n?

Book.java

public String toString(){
        return isbn+"\t"+lastName+"\t"+firstName+"\t"+title+"\t"+year+"\t"+
            String.format("%.2f",price);

BookCatalog.java

public String toString() {
        BookNode current = front;
        String s="";
        System.out.println(s);
        while (current!=null){
            //each book is listed on separate line
            s+=current.getData().toString()+"\n ";//System.getProperty("line.separator")
            current = current.getNext();
        }
        return s;
    }

Driver.java

public void loadDirectory() throws FileNotFoundException {
        if (f.exists()){
            Scanner input = new Scanner(f);
            while (input.hasNextLine()){
                String bookLine = input.nextLine();
                processBookLine(bookLine);
            }
        }
    }

public void processBookLine(String line){
        Scanner input = new Scanner(line);
        String isbn = input.next();
        String lastName = input.next();
        String firstName = input.next();

        String title = input.next();
        while (input.hasNext() && !input.hasNextInt()){//while next token is not an integer
            title += " "+input.next();
        }
        int year = input.nextInt();
        double price = input.nextDouble();
        Book book = Book.createBook(isbn, lastName, firstName, title, year, price);
        if (book!=null){
            catalog.add(book);
        }
    }

Ответ 1

Линейный символ \n не является разделителем строк в определенных операционных системах (например, в окнах, где он "\ r\n" ). Мое предложение состоит в том, что вместо этого вы используете \r\n, тогда он будет видеть разрыв строки только с \n и \r\n, у меня никогда не было проблем с его использованием.

Кроме того, вы должны изучить StringBuilder вместо конкатенации String в цикле while в BookCatalog.toString(), это намного эффективнее. Например:

public String toString() {
        BookNode current = front;
        StringBuilder sb = new StringBuilder();
        while (current!=null){
            sb.append(current.getData().toString()+"\r\n ");
            current = current.getNext();
        }
        return sb.toString();
}