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 循环结束,它现在可以按预期工作了!
我知道这里已经存在问题,但到目前为止,解决方案并没有真正帮助我。
我的问题是,我有一个包含 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 循环结束,它现在可以按预期工作了!