Java 如何在PrintStream的字符串中插入新行字符,然后使用扫描仪重新读取文件
我设计了几个类来模拟图书目录。我有一个book类(isbn、title等)、一个BookNode类、一个BookCatalog(图书链接列表)和一个驱动程序类(gui)。 我的问题是BookCatalog中有一个toString()方法,该方法应该返回所有书籍的字符串表示形式。Book类还重写toString()。我应该让书的每个字段用一个“标签”隔开,每本书用一个“新行”隔开。当我尝试使用PrintStream将图书目录打印到.txt文件时,\n不会注册 我尝试将其更改为System.getProperty(line.separator),它可以正确显示图书目录。但是现在,我遇到了一个问题,扫描器无法正确读取文件,并抛出一个“NoTouchElementException”。如何使扫描仪1)忽略行分隔符或2)使用printStream\n Book.javaJava 如何在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
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感谢您的澄清和参考!