如何将字符串中的新行字符插入PrintStream,然后使用扫描程序重新读取该文件

Sar*_*ara 10 java printstream java.util.scanner

我有几个专门用于模拟图书目录的课程.我有一个书类(isbn,title等),一个BookNode类,一个BookCatalog,它是一个书籍链接列表和一个驱动程序类(gui).我的问题是我在BookCatalog中有一个toString()方法,该方法应该返回所有书籍的String表示.Book类也重写toString().我应该让书的每个字段用"标签"分隔,每本书用"新行"分隔.当我尝试使用PrintStream将图书目录打印到.txt文件时,\n不会注册.

我试图将其更改为System.getProperty(line.separator),它正确显示bookcatalog.但是现在,我遇到一个问题,即Scanner无法正确读取文件并抛出"NoSuchElementException".如何使扫描仪1)忽略line.separator或2)让printStream使用\n?

Book.java

public String toString(){
        return isbn+"\t"+lastName+"\t"+firstName+"\t"+title+"\t"+year+"\t"+
            String.format("%.2f",price);
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

ddm*_*mps 31

换行符\n不是某些操作系统中的行分隔符(例如窗口,它是"\ r \n") - 我的建议是你\r\n改为使用,然后它只会看到换行符,\n而且\r\n我使用它时从来没有遇到任何问题.

此外,你应该考虑使用a StringBuilder而不是String在while循环中连接BookCatalog.toString(),它更有效.例如:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • @AVA我没有看到"额外"行的问题.请参见http://stackoverflow.com/a/729795/1690982. (2认同)