web-dev-qa-db-fra.com

comment insérer un nouveau caractère de ligne dans une chaîne dans PrintStream puis utiliser un scanner pour relire le fichier

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);
        }
    }
10
Sara

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();
}
31
ddmps