2013-03-19 4 views
10

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

Я попытался изменить его на System.getProperty (line.separator), который правильно отображает книжный каталог. Но теперь у меня проблема, когда сканер не будет правильно читать файл и выбрасывает «NoSuchElementException». Как получить сканер для 1) Игнорировать line.separator или 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); 
     } 
    } 
+0

Если вы утверждаете, что 'PrintStream' подавляет' \ r', вы ошибаетесь. Остальная часть вашего вопроса непонятна. – EJP

+0

Я использовал System.getProperty («line.separator») вместо \ n, поэтому, когда я открываю вновь созданный файл (из PrintStream) и пытаюсь перечитать его (сканер), он не будет обрабатывать строку. Я предполагаю, что «line.separator» является причиной, по которой я попытался сохранить символ в другой переменной, чтобы обойти его, но это тоже не сработало. – Sara

ответ

30

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

Кроме того, вы должны смотреть в использовании StringBuilder вместо конкатенации String в то время как петли на 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(); 
} 
+0

Я не вижу причин, почему это должно иметь значение. Сканер обрабатывает \ n, \ r и \ r \ n в качестве ограничителей строк уже и несколько других. – EJP

+0

@ EJP Scanner да, но если вы открываете .txt в блокноте только с \ n в Windows, он не будет регистрироваться. – ddmps

+0

@ Сара, это решение сработало для вас? –