Java 扫描仪一遍又一遍地读取同一个文件

Java Scanner reading same file over and over again

我知道这里已经存在问题,但到目前为止,解决方案并没有真正帮助我。

我的问题是,我有一个包含 5 行的文件,我想将它们准备好放入一个集合中。但是,当我读取扫描仪时,扫描仪到达文件末尾,它会从头开始重新开始,直到 complies 为太多打开的文件抛出错误。

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

public class TerminManager {
    String name;
    private Collection<Termin> termine;
    public TerminManager() {
        this.setName("aName");
        this.termine = new ArrayList<Termin>();
    }

    private void setName(String name) {
        this.name = name;
    }
    private String getName(){
        return this.name;
    }

    public void loadTermine(String fileName)
    {

        FileReader reader = null;
        Scanner sc = null;

        try
        {
            reader = new FileReader(fileName);
            sc = new Scanner(reader);
        } catch (FileNotFoundException e)
        {
            System.err.println("Datei " + fileName + " nicht gefunden!");
            e.printStackTrace();
        }

        while(sc.hasNext() == true)
        {
            String zeile = sc.next();
            String delims = "[;]";
            String[] zeile_feld = zeile.split(delims);
            Termin aTermin = new Termin(
                    zeile_feld[0],
                    zeile_feld[1],
                    zeile_feld[2],
                    zeile_feld[3]);
            this.termine.add(aTermin);

        }
        sc.close();

    }

    public void printTermine() {
    }
}

这是调用 loadTermine 的菜单class

import java.util.Scanner;

public class Menu
{
    
    private static TerminManager tManager = new TerminManager();
    private static Scanner sc = new Scanner("System.in");
    
    public Menu()
    {
        
    }
    
    public static void printMenu()
    {
        System.out.print("A)\t Laden der Verfügbaren Termine aus einer Text-Datei\n");
        System.out.print("B)\t Anzeigen der Verfügbaren Termine\n");
        System.out.print("C)\t Anlegen eines neuen Patienten\n");
        System.out.print("D)\t Erfassen einer Impfstoffanlieferung\n");
        System.out.print("E)\t Anzeige der aktuell verfügbaren Impfdosen\n");
        System.out.print("F)\t erfassen einer Impfterminvereinbarung mit einem Patienten\n");
        System.out.print("G)\t Erfassen einer durchgeführten SChutzimpfung auf Basis eines zuvor erstellen Impftermins\n");
        System.out.print("H)\t Beenden des Programms\n");
        
        System.out.println("Bitte geben Sie den buchstaben des Menue-Punktes ein: ");
    }
    
    public static void auswahlMenu(String auswahl)
    {
        boolean stop = false;
        while( stop == false)
        { 
            switch(auswahl.toLowerCase())
            {
                case "a": tManager.loadTermine("Impftermine.txt");break;
                case "b":tManager.printTermine();break;
                case "c": createPatient();break;
                default: System.out.print("Bitte einen Buchstaben zwischen \"A\" und \"H\" eingeben!"); stop = false;break;
            }
        }
    }

    private static void createPatient() {

    }
}

这是测试仪class,主要功能是

import java.util.Scanner;

public class Test {

    
    private static Menu menu = new Menu();
    private static Scanner eingabe = new Scanner(System.in);
    private static String weiter = "ja";
    private static String auswahl ="";
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
    while(weiter.equals("ja") || weiter.equals("j"))
    {
        menu.printMenu();
        auswahl = eingabe.next();
        menu.auswahlMenu(auswahl);
        auswahl.toLowerCase();
        if(!auswahl.equals("h"))
        {
            System.out.println("Moechten Sie weiter machen? (Ja/Nein)");
            weiter = eingabe.next();
            weiter.toLowerCase();
        } else 
        {
            weiter = "nein";
        }
        
        
    }
        
        
        
    }

}

这是我必须读取文件的代码。我在其他帖子中读到需要使用 .next() 函数才能使其正常工作,但对我的情况没有帮助。 可能是我太笨了,做错了。

提前感谢您的帮助!

感谢@RogerLindsjö 找到了问题!

问题是 auswahlMenu() 函数从未结束,因此总是开始读取文件。通过更改条件以便 while 循环结束,它现在可以按预期工作了!