Java 如何在PrintStream的字符串中插入新行字符,然后使用扫描仪重新读取文件

Java 如何在PrintStream的字符串中插入新行字符,然后使用扫描仪重新读取文件,java,java.util.scanner,printstream,Java,Java.util.scanner,Printstream,我设计了几个类来模拟图书目录。我有一个book类(isbn、title等)、一个BookNode类、一个BookCatalog(图书链接列表)和一个驱动程序类(gui)。 我的问题是BookCatalog中有一个toString()方法,该方法应该返回所有书籍的字符串表示形式。Book类还重写toString()。我应该让书的每个字段用一个“标签”隔开,每本书用一个“新行”隔开。当我尝试使用PrintStream将图书目录打印到.txt文件时,\n不会注册 我尝试将其更改为System.getP

我设计了几个类来模拟图书目录。我有一个book类(isbn、title等)、一个BookNode类、一个BookCatalog(图书链接列表)和一个驱动程序类(gui)。 我的问题是BookCatalog中有一个toString()方法,该方法应该返回所有书籍的字符串表示形式。Book类还重写toString()。我应该让书的每个字段用一个“标签”隔开,每本书用一个“新行”隔开。当我尝试使用PrintStream将图书目录打印到.txt文件时,\n不会注册

我尝试将其更改为System.getProperty(line.separator),它可以正确显示图书目录。但是现在,我遇到了一个问题,扫描器无法正确读取文件,并抛出一个“NoTouchElementException”。如何使扫描仪1)忽略行分隔符或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);
        }
    }

换行符
\n
在某些操作系统中不是行分隔符(例如windows,它是“\r\n”)-我的建议是您使用
\r\n
,然后它将只看到
\n
\r\n
的换行符,我使用它从来没有遇到过任何问题

此外,您还应该研究使用
StringBuilder
而不是在
BookCatalog.toString()
的while循环中连接
字符串,这样会更有效。例如:

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

如果您声称
PrintStream
抑制了
\r
,那么您就错了。您问题的其余部分不清楚。我使用了System.getProperty(“line.separator”)而不是\n,因此当我打开新创建的文件(从PrintStream)并尝试重新读取它(扫描仪)时,它将不会处理该行。我假设“line.separator”是原因,所以我尝试将字符保存在另一个变量中以绕过它,但这也不起作用。我看不出有什么原因会有什么不同。扫描器已经将\n、\r和\r\n作为行终止符处理,还有其他几个。@EJP扫描器是的,但是如果您在记事本上仅在Windows中打开一个.txt文件,它将不会注册。@ddmps它会在结尾插入一个额外的行!请建议如何处理它@AVA我看不出“额外”行的问题。请参阅。@ddmps感谢您的澄清和参考!