2013-03-19 7 views
10

Ich habe mehrere Klassen, um einen Buchkatalog zu simulieren. Ich habe eine Buchklasse (isbn, title, etc ...), eine BookNode-Klasse, einen BookCatalog, der eine LinkedList von Büchern ist und eine Treiberklasse (gui). Mein Problem ist, dass ich eine ToString() -Methode in BookCatalog habe, die eine String-Darstellung aller Bücher zurückgeben soll. Die Book-Klasse überschreibt auch toString(). Ich sollte jedes Feld des Buches durch einen "Tab" getrennt haben und jedes Buch durch eine "neue Zeile" getrennt haben. Wenn ich PrintStream verwende, um den Buchkatalog in eine TXT-Datei zu drucken, wird \ n nicht registriert.wie man ein neues Zeilenzeichen in eine Zeichenkette in PrintStream einfügt, dann benutze einen Scanner, um die Datei erneut zu lesen

Ich habe versucht, es in System.getProperty (line.separator) zu ändern, die den Buchkatalog korrekt anzeigt. Aber jetzt habe ich ein Problem, bei dem der Scanner die Datei nicht korrekt liest und eine "NoSuchElementException" auslöst. Wie bekomme ich den Scanner zu 1) Ignorieren Sie die Zeile. Separator oder 2) haben PrintStream verwenden \ 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

Wenn Sie behaupten, dass 'PrintStream' das' \ r' unterdrückt, irren Sie sich. Der Rest Ihrer Frage ist nicht klar. – EJP

+0

benutzen ich die System.getProperty („line.separator“) anstelle von \ n so, wenn ich die neu erstellte Datei öffnen (von Printstream) und versuchte es (Scanner) erneut zu lesen, es wird die Zeile nicht verarbeiten. Ich nehme an, dass der "line.separator" der Grund ist, weshalb ich versuchte, das Zeichen in einer anderen Variablen zu speichern, um es zu umgehen, aber das hat auch nicht funktioniert. – Sara

Antwort

30

Das Zeilenvorschubzeichen \n nicht die Linie Separator in bestimmten Betriebssystemen (wie beispielsweise Windows, wo es "\ r \ n" ist - mein Vorschlag ist, dass Sieverwendenstatt, dann wird es beide den Zeilenumbruch mit nur \n und \r\n sehen, ich hatte nie irgendwelche Probleme damit.

Auch Sie bei BookCatalog.toString() ein StringBuilder statt verketten die String in der while-Schleife in verwenden, ist es viel effektiver aussehen sollten. Zum Beispiel:

+0

Ich sehe keinen Grund, warum dies einen Unterschied machen sollte. Scanner-Handles \ n, \ r und \ r \ n bereits als Zeilenabschlusszeichen und einige andere. – EJP

+0

@EJP Scanner Ja, aber wenn Sie eine .txt im Editor mit nur \ n in Windows öffnen, wird es nicht registriert. – ddmps

+0

@Sara, hat diese Lösung für Sie funktioniert? –

Verwandte Themen