java - كيف يمكنني جعل فئة تقبل اسم ملف ويمكن طباعة محتوياته؟



file printing (1)

أواجه مشاكل في جعل فئة يمكن قراءة وطباعة من ملف. يبدو أن اسم الملف الذي تم تمريره إلى منشئ لا يتم تعيين في الواقع إلى متغير فلينام، أو ربما أفعل شيئا خاطئا مع كائنات ملف والماسح الضوئي. أنا حقا لا أعرف ما هو الخطأ أو كيفية إصلاحه. أنا مبتدئ ومغطاة فقط باستخدام الملفات في فئتي، لذلك أنا ربما في عداد المفقودين شيء واضح. شكرا على اي مساعدة أي شخص يمكن أن تعطي :)

إليك كل الشفرة والتعليمات الخاصة بالتعيين أدناه.

وكانت المهمة هي:

اكتب فئة تسمى فليديسبلاي بالطرق التالية:

  • كونستروكتور: يقبل اسم الملف كحجة

  • ديسبلاييد: يجب أن تعرض هذه الطريقة فقط الأسطر الخمسة الأولى من محتويات الملف. إذا كان الملف يحتوي على أقل من خمسة أسطر، فإنه يجب عرض محتويات الملف بأكمله.

  • ديسبلايكونتينتس: يجب أن تعرض هذه الطريقة محتويات الملف بالكامل، وتم تمرير اسمها إلى منشئ.

  • ديسبلايثلينينومبرز: يجب أن تعرض هذه الطريقة محتويات الملف، الذي تم تمرير اسمه إلى منشئ. يجب أن يسبق كل سطر رقم سطر متبوعا بنقطتين. يجب أن يبدأ ترقيم الأسطر في 1.

رمز بلدي:

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

}

كما كتبت طلبا للسائق لاختبار ما إذا كان الفصل يعمل أم لا:

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

مشكلتك هنا:

File file = new File(fileName);

هذا البيان هو خارج منشئ الخاص بك.

يتم تنفيذه قبل بدء تشغيل منشئ. وبالتالي يتم إنشاء كائن الملف مع الخطأ (الافتراضي الخاص بك!) اسم! (انظر هنا لمزيد من القراءة)

أفضل نهج هنا: جعل الحقول الخاصة بك النهائي ، واستخدام "منشئ تصغير"؛ مثله:

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

والآن مترجم يساعدك على التأكد من أن الحقول الخاصة بك الحصول على تهيئة مرة واحدة بالضبط، في الترتيب الذي وضعت أسفل مرة واحدة في منشئ الخاص بك. وأنت المهارة لديك الفرصة لإنشاء كائن فيليديسبلاي باستخدام بعض "الافتراضي" اسم الملف (حيث، في الواقع: أوصي بعدم القيام بذلك).





constructor