Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht

B

_brina205

Mitglied
Ich habe einen Pizza-Bestellsystem erzeugt für eine Hausaufgabe. Jetzt soll ich, wenn ich im Menü Bestellung auf Lesen klicke, die Textdatei ausgelesen werden. Allerdings erkennt der Scanner obwohl etwas in der Textdatei steht nichts und gibt dann im Dialogfenster nur ein leeres Array aus. Muss ich die Textdatei irgendwie noch freigeben oder so was?
Es passiert auch nur wenn ich das Programm starte und direkt auf Lesen klicke, wenn ich zuerst mit der Methode writeOrderCSV in die Datei schreibe, erkennt er es.

Controller:
public class Controller {

    private PizzaKonfigurator view;
    private DataStorage dataStorage;
    private Pizza pizza;
    private Order order;


    public static void main(String[] args) {
        PizzaKonfigurator view = new PizzaKonfigurator();
        new Controller(view);
        view.setVisible(true);
    }

    public Controller(PizzaKonfigurator view) {
        this.view = view;
        order = new Order();
        dataStorage = new DataStorage();
        initController();
    }

    /**
     * Initialisiert den Controller mit allen Aktionen
     */
    public void initController() {
        view.getMyMenuBar().getMenuItemBeenden().addActionListener(e -> System.exit(0));
        view.getMyMenuBar().getMenuItemLesen().addActionListener(e -> {
            JOptionPane.showMessageDialog(view, "Bestellung " + order.getOrderId() + order.getPizzas(), "Bestellung", JOptionPane.INFORMATION_MESSAGE);
        });
        view.getMyMenuBar().getMenuItemSpeichern().addActionListener(e -> dataStorage.writeOrderCSV(order));
        view.getPizzaSize().addActionListener(e -> view.getPizzaSize().getSelectedItem());
        for (JRadioButton topping : view.getToppings()) {
            topping.addActionListener(e -> topping.getText());
        }
        Object[] options = {"Ja", "Nein"};
        view.getFertig().addActionListener(e -> {
            pizzaErzeugen();
            JOptionPane.showMessageDialog(view, "Preis: " + pizza.getPrice(), "Bestellung", JOptionPane.INFORMATION_MESSAGE);
            int n = JOptionPane.showOptionDialog(view, "Möchten Sie die Pizza zur Bestellung hinzufügen?", "Bestellung", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
            if (n == JOptionPane.YES_OPTION) {
                order.addPizza(pizza);
            }
        });
        view.getBeenden().addActionListener(e -> {
            int n = JOptionPane.showOptionDialog(view, "Möchten Sie die Anwendung wirklich beenden?", "Beenden", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
            if (n == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        });
    }
DataStorage:
public void writeOrderCSV(Order order) {
        try {
            pWriter = new PrintWriter(new BufferedWriter(new FileWriter("bestellung.txt")));
            pWriter.println("Bestellung: ");
            for (Pizza pizza : order.getPizzas()) {
                pWriter.format("Größe: %s ; Beläge: %s ; Preis: %,.2f %n", pizza.getSize(), pizza.getToppings(), pizza.getPrice());
            }
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Fehler" , "Fehler", JOptionPane.WARNING_MESSAGE);
        } finally {
            if (pWriter != null) {
                pWriter.close();
            }
        }
    }

    public Order readOrderCSV() {
        Order order = new Order();
        try {
            Scanner s = new Scanner(new BufferedReader(new FileReader("bestellung.txt")));
            Pizza pizza = null;
            while (s.hasNext(";")) {
                s.useDelimiter(";");
                //Größe auslesen
                String size = s.next();
                for (PizzaSize psize : PizzaSize.values()) {
                    if (size.contains(psize.toString())) {
                        pizza = new Pizza(psize);
                    }
                }
                //Toppings auslesen
                String belaege = s.next();
                for (PizzaTopping topping : PizzaTopping.values()) {
                    if (belaege.contains(topping.toString())) {
                        pizza.toppingHinzufügen(topping);
                    }
                }
                order.addPizza(pizza);
                s.useDelimiter(System.lineSeparator());
            }
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Die angegebene Datei existiert nicht" , "Datei", JOptionPane.WARNING_MESSAGE);
        }
        return order;

    }

Textdatei.txt:
Bestellung:
Größe: Klein ; Beläge: [Salami, Ananas, Käse, Schinken] ; Preis: 13,00
Größe: Klein ; Beläge: [Nutella, Ananas] ; Preis: 6,00
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Du kannst einfach mal ausgeben was in readOrderCSV() passiert, z.B.: System.out.println(size); und dann auch schrittweise, was in den Schleifen passiert.
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Wenn du mit einem Scanner eine Datei öffnest, dann ist es notwendig den Scanner zu schließen, wenn keine Dateizugriffe mehr benötigt werden.
Am einfachsten funktioniert das so:
Java:
try(Scanner scanner = new Scanner(...)) {
  ...
}
Es kann aber auch direkt #close() aufgerufen werden.
Ein Scanner wird normalerweise nicht geschlossen wenn von System.in gelesen wird.
 
B

_brina205

Mitglied
Das mit dem Scanner habe ich jetzt gemacht, aber trotzdem gleiches Ergebnis.
Beim Debuggen habe ich gesehen, dass es schon die while-Schleife überspringt, weil der Scanner die Textdatei als leer ansieht und kein Semikolon findet.
 
B

_brina205

Mitglied
Aber ich verstehe doch nicht, warum es die Textdatei als leer ansieht, das ist doch das Problem :D
Weil es steht eindeutig was drin, wenn ich die Textdatei öffne, bevor ich das Programm starte.
 
kneitzel

kneitzel

Top Contributor
Du hast die Stelle, die sich anders verhält als erwartet, doch erkannt. Somit scheint hasNext etwas anderes zu machen, als du dachtest.

Daher wäre es doch nun naheliegend, dem nach zu gehen. Hast Du eine Idee, wo und wie Du die Dokumentation von der Klasse Scanner finden kannst? Und dann die Methode hasNext(String)?
 
K

Kuryu

Mitglied
Hey brina. Ich bin mir nicht mehr ganz sicher aber ich glaube das müsste so aussehen:


Java:
public Order readOrderCSV() {
        Order order = new Order();
        try {
            Scanner s = new Scanner(new BufferedReader(new FileReader("bestellung.txt")));
            Pizza pizza = null;
            s.useDelimiter(";");
            while (s.hasNext()) {
                
                //Größe auslesen
                String size = s.next();
                for (PizzaSize psize : PizzaSize.values()) {
                    if (size.contains(psize.toString())) {
                        pizza = new Pizza(psize);
                    }
                }
                //Toppings auslesen
                String belaege = s.next();
                for (PizzaTopping topping : PizzaTopping.values()) {
                    if (belaege.contains(topping.toString())) {
                        pizza.toppingHinzufügen(topping);
                    }
                }
                order.addPizza(pizza);
                s.useDelimiter(System.lineSeparator());
            }
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Die angegebene Datei existiert nicht" , "Datei", JOptionPane.WARNING_MESSAGE);
        }
        return order;

    }


Du solltest auf jeden Fall deinen Scanner am Ende closen. also s.close(); noch mit einbauen. Und ansonsten kannst du ja System.out.println()'s in die die Zwischenschritte mit einbauen um zu sehen welche Strings du gerade wo und wann ausliest.
Ich hoffe, dass ich dir weiterhelfen konnte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Bluedaishi Twain Scanner im Netzwerk Allgemeine Java-Themen 10
J Scanner oder BufferReader Allgemeine Java-Themen 2
1 Java Scanner Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
I Scanner Variable Klassenimtern deklarieren Allgemeine Java-Themen 12
T Datentypen Scanner Allgemeine Java-Themen 4
A Erste Schritte If Abfragen + Scanner Allgemeine Java-Themen 7
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
P Input/Output Datei einlesen per Scanner(f) - mit Cron gehts nicht Allgemeine Java-Themen 1
S Erste Schritte Scanner in Methode einbauen Allgemeine Java-Themen 4
B QR Scanner WebCam Allgemeine Java-Themen 2
P Scanner als Inputstream für Java Prozess Allgemeine Java-Themen 4
H Scanner: Ausgabe erst nach Abbruch Allgemeine Java-Themen 8
S Bekomme mit Scanner und URL keine Html-Seite ausgelesen Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
Ark Locale, Formatter und Scanner: Bug bei Gleitkommazahlen? Allgemeine Java-Themen 2
X Scanner hört nach der 25. Zeile auf Allgemeine Java-Themen 6
A Split, Scanner, StringTokenizer oder PatternMatching für flexibles Dateieinlesen? Allgemeine Java-Themen 2
D java.util.InputMismatchException im Scanner -wieso? Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
N Scanner läuft nicht durch Allgemeine Java-Themen 2
R Scanner mit Java Allgemeine Java-Themen 2
J Parser / Scanner / Tokenizer gesucht Allgemeine Java-Themen 3
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
J Mit Scanner-Klasse eine Datei zeilenweise einlesen und nur bestimmte Zeichen abfragen Allgemeine Java-Themen 11
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
R Barcode Scanner mit JavaPos ansprechen Allgemeine Java-Themen 1
M Barcode-Scanner unterscheidung zur Tastertur Allgemeine Java-Themen 7
H Problem mit Scanner Klasse Allgemeine Java-Themen 7
E Wie Zeichen eingeben mit Klasse Scanner? Allgemeine Java-Themen 5
D Problem mit java.util.scanner: Falsche Ergebnisse Allgemeine Java-Themen 4
E Scanner Frage :) Allgemeine Java-Themen 8
A Unterschied Scanner und Matcher Allgemeine Java-Themen 5
S Problem mit Scanner Allgemeine Java-Themen 5
G Barcode (Strichcode)-Scanner Allgemeine Java-Themen 10
G Scanner.hasNext() beendet den Thread ohne Message Allgemeine Java-Themen 4
S Scanner Allgemeine Java-Themen 6
G Scanner-Generator zur Erkennung von Java Tokens Allgemeine Java-Themen 7
B Try/Catch in While-Schleife mit Scanner - Hilfe! Allgemeine Java-Themen 3
K Scanner.hasNext findet kein Ende Allgemeine Java-Themen 6
D ProcessBuilder und Scanner Probleme mit einigen Prozessen Allgemeine Java-Themen 2
S Die Methode close() der Klasse Scanner Allgemeine Java-Themen 3
G Scanner und Abbruchbedingung/Pattern Allgemeine Java-Themen 2
bernd java.util.Scanner erst ab Java 1.5? Allgemeine Java-Themen 4
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
T Swing TrayIcon erkennt links klick nicht (Mac) Allgemeine Java-Themen 2
V VisualVM Was erkennt ihr hier? Allgemeine Java-Themen 9
K BufferedReader.readLine erkennt Zeilenende nicht Allgemeine Java-Themen 11
G RegEx erkennt nicht Allgemeine Java-Themen 2
L Tomcat erkennt Share nicht Allgemeine Java-Themen 6
Tobero JFrame nimmt keinen Key oder Maus inputs Allgemeine Java-Themen 0
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
J BufferedImage aus PNG Files haben keinen Type Allgemeine Java-Themen 4
J Warum gibt es keinen Webbrowser auf Java-Basis? Allgemeine Java-Themen 8
G POI: Leere Zelle nimmt keinen Type an Allgemeine Java-Themen 8
H Array nimmt keinen in Integer konvertierten String auf! Allgemeine Java-Themen 26

Ähnliche Java Themen


Oben