2017-03-20 14 views
5

Tôi gặp sự cố khi tạo lớp học có thể đọc và in từ một tệp. Có vẻ như tên tệp được truyền cho hàm tạo không thực sự được gán cho biến fileName, hoặc có thể tôi đang làm điều gì đó sai với các đối tượng File và Scanner. Tôi thực sự không biết những gì sai hoặc làm thế nào để sửa chữa nó. Tôi là một người mới bắt đầu và chỉ được bảo vệ bằng cách sử dụng các tập tin trong lớp học của tôi, vì vậy tôi có thể thiếu một cái gì đó hiển nhiên. Cảm ơn bạn đã giúp đỡ bất kỳ ai có thể cung cấp cho :)Tôi làm cách nào để tạo một lớp chấp nhận tên tệp và có thể in nội dung của nó?

Đây là tất cả mã của tôi và hướng dẫn cho bài tập bên dưới.

Việc chuyển nhượng là:

Viết một lớp tên là FileDisplay với các phương pháp sau:

  • constructor: chấp nhận tên tập tin như là đối số

  • displayHead: Phương pháp này sẽ hiển thị chỉ năm dòng đầu tiên của nội dung của tệp. Nếu tệp chứa ít hơn năm dòng, tệp sẽ hiển thị toàn bộ nội dung của tệp.

  • displayContents: Phương thức này sẽ hiển thị toàn bộ nội dung của tệp, tên đã được truyền cho hàm tạo.

  • displayWithLineNumbers: Phương thức này sẽ hiển thị nội dung của tệp, tên được truyền đến hàm tạo. Mỗi dòng phải đứng trước một số dòng, sau đó là dấu hai chấm. Việc đánh số dòng nên bắt đầu từ 1.

Mã của tôi:

import java.io.*; 
import java.util.Scanner; 

public class FileDisplay { 

    // just using little random .txt files to test it 
    private String fileName = "example1.txt"; 

    public FileDisplay(String fileName) throws IOException { 
     this.fileName = fileName; 
    } 

    File file = new File(fileName); 
    Scanner inputFile = new Scanner(file); 

    // displays first 5 lines of file 
    public void displayHead() {   
     for (int x = 0; x < 5 && inputFile.hasNext(); x++) { 
      System.out.println(" " + inputFile.nextLine()); 
     } 
    } 

    //displays whole file 
    public void displayContents() {  
     while (inputFile.hasNext()) { 
      System.out.println(" " + inputFile.nextLine()); 
     } 
    } 

    // displays whole file with line numbers 
    public void displayWithLineNumbers() {  
     while (inputFile.hasNext()) { 
      int x = 1; 
      System.out.println(x + ": " + inputFile.nextLine()); 
      x++; 
     } 
    } 

    @Override 
    public String toString() { 
     return "FileDisplay [someFile=" + fileName + "]"; 
    } 

} 

Tôi cũng đã viết một ứng dụng điều khiển để kiểm tra xem lớp đang làm việc hay không:

import java.io.*; 

public class FileDisplayTest { 

    public static void main(String[] args) throws IOException { 

     PrintWriter ex1 = new PrintWriter("example1.txt"); 
     ex1.println("apple"); 
     ex1.println("pear"); 
     ex1.println("grape"); 
     ex1.close(); 

     FileDisplay test = new FileDisplay("example1.txt"); 
     test.displayContents();   
     System.out.println(test.toString());   
    } 
} 
+1

Thử đặt 'Tệp tin = tệp mới (tên tệp); Đầu vào máy quétFile = Máy quét mới (tệp); 'bên trong hàm tạo, hoặc chúng sẽ không sử dụng tên tệp đã chọn. – Berger

Trả lời

3

của bạn vấn đề ở đây:

File file = new File(fileName); 

Tuyên bố đó là bên ngoài của nhà xây dựng của bạn.

Nó được thực hiện trước khi hàm tạo khởi động. Do đó đối tượng tệp được tạo với tên sai (mặc định của bạn!)! (xem here để đọc thêm)

Cách tiếp cận tốt hơn ở đây: làm cho các trường của bạn final và sử dụng "kính viễn vọng xây dựng"; như thế này:

private final String fileName; 
private final Scanner scanner; 

public FileDisplay() { 
    this("default.txt"); 
} 

public FileDisplay(String fileName) { 
    this.fileName = fileName; 
    this.scanner = new Scanner(new File(fileName)); 
} 

Và bây giờ trình biên dịch giúp bạn và đảm bảo rằng các lĩnh vực của bạn có được khởi tạo một cách chính xác một lần, theo thứ tự mà bạn đặt xuống lần trong constructor của bạn. Và bạn có cơ hội để tạo ra một đối tượng FileDisplay bằng cách sử dụng một số tên tập tin "mặc định" (ở đâu, thực sự: Tôi sẽ khuyên bạn không nên làm điều đó).

+0

Cảm ơn bạn! Điều đó thực sự hữu ích. Về tên tập tin mặc định, tôi chỉ có trong đó bởi vì nó sẽ không hoạt động chút nào nếu thiếu nó. – Squirrelstilts

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