2013-03-19 7 views
10

Ho diverse classi progettate per la simulazione di un catalogo di libri. Ho una classe di libri (isbn, titolo, ecc.), Una classe BookNode, un BookCatalog che è una lista Linked di libri e una classe di driver (gui). Il mio problema è che ho un metodo toString() in BookCatalog che dovrebbe restituire una rappresentazione String di tutti i libri. Anche la classe Book sovrascrive toString(). Dovrei avere ogni campo del libro separato da una "scheda" e ogni libro separato da una "nuova riga". Quando provo a usare PrintStream per stampare il catalogo libri in un file .txt, il \ n non si registra.come inserire un nuovo carattere di linea in una stringa su PrintStream, quindi utilizzare uno scanner per rileggere il file

Ho provato a cambiarlo in System.getProperty (line.separator) che visualizza correttamente il bookcatalog. Ma ora ho un problema in cui lo scanner non legge correttamente il file e lancia una "noSuchElementException". Come ottengo lo scanner 1) Ignora il line.separator o 2) usa 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

Se stai sostenendo che 'PrintStream' sopprime il' \ r' ti stai sbagliando. Il resto della tua domanda non è chiaro. – EJP

+0

Ho usato System.getProperty ("line.separator") invece di \ n così quando apro il file appena creato (da PrintStream) e ho provato a rileggerlo (scanner), non elaborerà la linea. Suppongo che il "line.separator" sia la ragione per cui così ho provato a salvare il personaggio in un'altra variabile per aggirarlo ma non ha funzionato. – Sara

risposta

30

Il carattere di avanzamento \n non è la linea di separazione in alcuni sistemi operativi (ad esempio windows, dove è "\ r \ n") - il mio suggerimento è che tu usi \r\n, invece, entrambi vedranno l'interruzione di linea con solo \n e \r\n, non ho mai avuto alcun problema nell'utilizzarlo.

Inoltre, si dovrebbe considerare di usare un StringBuilder invece di concatenando il String nel ciclo while a BookCatalog.toString(), è molto più efficace. Ad esempio:

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

Non vedo alcuna ragione per cui questo dovrebbe fare alcuna differenza. Lo scanner gestisce \ n, \ r e \ r \ n come terminatori di linea già e anche molti altri. – EJP

+0

@EJP Scanner sì, ma se apri un .txt sul blocco note con solo \ n in Windows, non verrà registrato. – ddmps

+0

@Sara, questa soluzione ha funzionato per te? –

Problemi correlati