как вставить новый символ строки в строку для 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;
    }

Драйвер.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);
        }
    }

person Sara    schedule 19.03.2013    source источник
comment
Если вы утверждаете, что PrintStream подавляет \r, вы ошибаетесь. Остальная часть вашего вопроса не ясна.   -  person user207421    schedule 20.03.2013
comment
Я использовал System.getProperty(line.separator) вместо \n, поэтому, когда я открываю вновь созданный файл (из PrintStream) и пытаюсь его перечитать (сканер), он не обрабатывает строку. Я предполагаю, что причиной является line.separator, поэтому я попытался сохранить символ в другой переменной, чтобы обойти его, но это тоже не сработало.   -  person Sara    schedule 21.03.2013


Ответы (1)


Символ перевода строки \n не является разделителем строк в некоторых операционных системах (например, в Windows, где это «\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();
}
person ddmps    schedule 19.03.2013
comment
Я не вижу причин, почему это должно что-то изменить. Сканер уже обрабатывает \n, \r и \r\n как разделители строк, а также некоторые другие. - person user207421; 22.03.2013
comment
@EJP Scanner да, но если вы откроете .txt в блокноте только с \n в Windows, он не будет зарегистрирован. - person ddmps; 30.03.2014
comment
@ddmps В конце вставляется дополнительная строка! Подскажите как с этим бороться! - person AVA; 15.10.2015
comment
@AVA Я не вижу проблемы с дополнительной строкой. См. stackoverflow.com/a/729795/1690982. - person ddmps; 15.10.2015
comment
@ddmps Спасибо за пояснение со ссылкой! - person AVA; 26.10.2015
comment
Использование \r\n вместо \n у меня отлично работает. Большое спасибо. Поднято!. - person iamjoshua; 15.01.2018