J'ai plusieurs cours conçus pour simuler un catalogue de livres. J'ai une classe de livres (isbn, title, etc ...), une classe BookNode, un BookCatalog qui est une LinkedList de livres et une classe de pilotes (gui). Mon problème est que j'ai une méthode toString () dans BookCatalog qui est censée retourner une représentation String de tous les livres. La classe Book remplace également toString (). Je suis censé avoir chaque champ du livre séparé par un "onglet" et chaque livre séparé par une "nouvelle ligne". Lorsque j'essaie d'utiliser PrintStream pour imprimer le catalogue de livres dans un fichier .txt, le\n ne s'enregistre pas.
J'ai essayé de le changer en System.getProperty (line.separator) qui affiche correctement le bookcatalog. Mais maintenant, j'ai un problème où le scanner ne lira pas correctement le fichier et lance une "NoSuchElementException". Comment puis-je amener le scanner à 1) ignorer le line.separator ou 2) utiliser 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);
}
}
Le caractère de saut de ligne \n
N'est pas le séparateur de ligne dans certains systèmes d'exploitation (tels que Windows, où il est "\ r\n") - ma suggestion est d'utiliser plutôt \r\n
, Alors c'est ' Tous les deux verront le saut de ligne avec seulement \n
et \r\n
, je n'ai jamais eu de problème à l'utiliser.
En outre, vous devriez envisager d'utiliser un StringBuilder
au lieu de concaténer le String
dans la boucle while de BookCatalog.toString()
, c'est beaucoup plus efficace. Par exemple:
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();
}