2013-03-19 35 views
10

Tôi có một số lớp được thiết kế để mô phỏng danh mục sách. Tôi có một lớp sách (isbn, tiêu đề, vv ...), một lớp BookNode, một BookCatalog mà là một LinkedList của sách và một lớp trình điều khiển (gui). Vấn đề của tôi là tôi có phương thức toString() trong BookCatalog, nghĩa vụ trả về một biểu diễn String của tất cả các sách. Lớp Book cũng ghi đè toString(). Tôi phải có từng lĩnh vực của cuốn sách được phân cách bởi một "tab" và mỗi cuốn sách được phân tách bằng một "dòng mới". Khi tôi cố gắng sử dụng PrintStream để in danh mục sách sang tệp .txt, \ n không đăng ký.cách chèn ký tự dòng mới trong chuỗi vào PrintStream rồi sử dụng máy quét để đọc lại tệp

Tôi đã cố gắng thay đổi nó thành System.getProperty (line.separator) hiển thị sách chính xác. Nhưng bây giờ, tôi có một vấn đề mà Scanner sẽ không đọc tập tin một cách chính xác và ném một "NoSuchElementException". Làm thế nào để tôi nhận được máy quét đến 1) Bỏ qua line.separator hoặc 2) có sử dụng printStream \ n không?

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); 
     } 
    } 
+0

Nếu bạn tuyên bố rằng 'PrintStream' chặn' \ r' bạn bị nhầm lẫn. Phần còn lại của câu hỏi của bạn không rõ ràng. – EJP

+0

Tôi đã sử dụng System.getProperty ("line.separator") thay vì \ n vì vậy khi tôi mở tệp mới được tạo (từ PrintStream) và cố gắng đọc lại nó (máy quét), nó sẽ không xử lý dòng. Tôi giả định rằng "line.separator" là lý do tại sao vì vậy tôi đã cố gắng để lưu các nhân vật trong một biến để bỏ qua nó, nhưng điều đó đã không làm việc hoặc. – Sara

Trả lời

30

Nhân vật linefeed \n không phải là tách dòng trong hệ điều hành nào đó (chẳng hạn như cửa sổ, nơi nó là "\ r \ n") - đề xuất của tôi là bạn sử dụng \r\n thay vào đó, sau đó cả hai sẽ nhìn thấy ngắt dòng chỉ với \n\r\n, tôi chưa bao giờ gặp bất kỳ vấn đề nào khi sử dụng nó.

Ngoài ra, bạn nên xem xét sử dụng StringBuilder thay vì ghép nối String trong vòng lặp while tại BookCatalog.toString(), hiệu quả hơn rất nhiều. Ví dụ:

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

Tôi không thấy bất kỳ lý do nào tại sao điều này sẽ tạo nên sự khác biệt. Máy quét xử lý \ n, \ r và \ r \ n làm các công cụ tạo dòng, và một số công cụ khác nữa. – EJP

+0

@EJP Scanner có, nhưng nếu bạn mở một .txt trên notepad chỉ với \ n trong Windows, nó sẽ không đăng ký. – ddmps

+0

@Sara, giải pháp này có hiệu quả với bạn không? –

Các vấn đề liên quan