【问题标题】:Java Scanner reading same file over and over againJava Scanner 一遍又一遍地读取同一个文件
【发布时间】:2023-03-09 08:20:02
【问题描述】:

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

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

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 的菜单类

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() {

    }
}

这是测试器类,主要功能在哪里

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() 函数才能使其工作,但在我的情况下它没有帮助。 也许我只是愚蠢并且做错了。

提前感谢您的帮助!

【问题讨论】:

  • 你能附上一些调用loadTermine方法的代码吗?
  • 旁注:1) while 循环应该在 try 块内,2) 你可能想使用 try-with-resources (try(FileReader reader = new FileReader(filename); Scanner sc = new Scanner(reader)) { ... }, 3) while(sc.hasNext() == true) 可以缩短到while(sc.hasNext())。 4) 你可能想使用sc.nextLine(); 而不是sc.next();
  • 我无法使用您提供的代码重现您的问题。我怀疑你反复调用loadTermine,由于你没有关闭FileReader,所以你得到了一个例外。
  • 也许您应该在方法返回之前关闭扫描程序?这至少应该可以防止“打开文件过多”的问题。
  • 我更新了帖子,以便您可以看到所有涉及的课程。 @MCEmperor 我关闭了文件阅读器,它只是不在帖子中

标签: java java.util.scanner filereader


【解决方案1】:

感谢@RogerLindsjö,找到了问题!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2013-11-15
    相关资源
    最近更新 更多