2017-03-20 75 views
5

Mam problemy z tworzeniem klasy, która może czytać i drukować z pliku. Wygląda na to, że nazwa pliku przekazana do konstruktora nie jest faktycznie przypisana do zmiennej fileName, lub może robię coś nie tak z obiektami File and Scanner. Naprawdę nie wiem, co jest nie tak i jak to naprawić. Jestem początkującym i po prostu przykrywam używanie plików w mojej klasie, więc prawdopodobnie brakuje mi czegoś oczywistego. Dziękuję za pomoc, którą każdy może dać :)Jak utworzyć klasę, która akceptuje nazwę pliku i może wydrukować jej zawartość?

Oto mój kod i instrukcje dotyczące zadania poniżej.

Zadanie było:

Napisz klasę o nazwie FileDisplay z następujących metod:

  • konstruktor: Przyjmuje nazwa pliku jako argument

  • displayHead: Ta metoda powinna wyświetlić tylko pierwsze pięć linii zawartości pliku. Jeśli plik zawiera mniej niż pięć linii, powinien wyświetlić całą zawartość pliku.

  • displayContents: Ta metoda powinna wyświetlić całą zawartość pliku, którego nazwa została przekazana do konstruktora.

  • displayWithLineNumbers: Ta metoda powinna wyświetlić zawartość pliku, którego nazwę przekazano do konstruktora. Każda linia powinna być poprzedzona numerem linii, a następnie dwukropkiem. Numeracja linii powinna rozpocząć w 1.

Mój kod:

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 + "]"; 
    } 

} 

Ja też napisałem aplikację sterownika aby sprawdzić, czy klasa pracuje czy nie:

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

Spróbuj umieścić "Plik pliku = nowy plik (nazwa pliku); Scanner inputFile = new Scanner (plik); 'wewnątrz konstruktora lub nie będą używać wybranej nazwy pliku. – Berger

Odpowiedz

3

Twój problem występuje tutaj:

File file = new File(fileName); 

To oświadczenie jest poza Twojego konstruktora.

Jest wykonywany przed Konstruktor kopie. Dlatego obiekt pliku jest tworzony z niepoprawną (domyślną!) Nazwą! (patrz here do dalszego czytania)

Lepsze podejście tutaj: przygotuj swoje pola final i użyj "teleskopu konstruktora"; tak:

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

A teraz kompilator pomaga upewniając się, że pola uzyskać zainicjowany dokładnie raz, w kolejności, w której można umieścić w dół raz w konstruktorze. Umiejętności mają możliwość utworzenia obiektu FileDisplay za pomocą "domyślnej" nazwy pliku (gdzie, właściwie: nie polecam tego robić).

+0

Dziękujemy! To naprawdę pomogło. O domyślnej nazwie pliku, właśnie to miałem, ponieważ bez niego nie działałby wcale. – Squirrelstilts