Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Datei-I/O in Java: Ein Leitfaden zur Verarbeitung von Kursdaten (COP3330 HW5)

Lerne, wie man mit Java Dateien liest und schreibt, um Kursdaten zu verarbeiten. Dieser Leitfaden erklärt die Grundlagen der Datei-I/O anhand eines realitätsnahen Beispiels aus der Hochschulverwaltung.

Java Datei-I/O Tutorial Dateien lesen und schreiben Java COP3330 Hausaufgabe Kursdaten verarbeiten Java BufferedReader Java Beispiel BufferedWriter Java Textdatei parsen Java Online-Kurse zählen Java Raum-CRN Zuordnung Java lecturesOnly.txt erstellen Java Programmierung Übung Dateiverarbeitung Java Studium Java I/O für Anfänger CSV-Datei Java einlesen Java Hausaufgabe Hilfe Datei-I/O Praxisbeispiel

Einführung in die Datei-I/O mit Java

Die Verarbeitung von Dateien ist eine grundlegende Fähigkeit in der Programmierung. In diesem Tutorial lernst du, wie du mit Java Textdateien lesen und schreiben kannst, um strukturierte Daten zu analysieren. Das Beispiel basiert auf einer typischen Aufgabe aus dem Kurs COP3330, bei der Kursinformationen aus einer Datei gelesen und verarbeitet werden.

Warum ist Datei-I/O wichtig?

In der realen Welt müssen Programme oft mit externen Datenquellen arbeiten. Ob du eine App für die Kursverwaltung schreibst oder ein Tool zur Analyse von Sportergebnissen – das Einlesen und Speichern von Daten ist unverzichtbar. Stell dir vor, du entwickelst eine App, die die aktuellen Spielergebnisse der Fußball-Bundesliga verarbeitet: Die Daten kommen als CSV-Datei, und dein Programm muss sie einlesen, filtern und eine neue Datei mit den Top-Torschützen erstellen. Genau solche Fähigkeiten übst du hier.

Das Problem verstehen

Die Aufgabe besteht darin, eine Datei namens lec.txt zu verarbeiten, die Informationen über Kurse enthält. Jede Zeile hat ein bestimmtes Format: CRN, Kursnummer, Kurstitel, Niveau, Modus (z.B. F2F, Online, Mixed), Raum und optional eine Lab-Information. Ziel ist es, drei Dinge zu tun:

  1. Die Anzahl der Online-Kurse zu zählen.
  2. Nach einem vom Benutzer eingegebenen Raum zu suchen und alle CRNs (Kursnummern) auszugeben, die in diesem Raum stattfinden.
  3. Eine neue Datei lecturesOnly.txt zu erstellen, die alle Online-Kurse und Kurse ohne Lab auflistet.

Die Datei lec.txt verstehen

Die Datei enthält Zeilen wie diese:

89745,COT6578,Advanced Computer theory,Graduate,F2F,PSY-108,No
32658,COT6578,Advanced Computer theory,Graduate,Mixed,LPS-35,No
69745,COP5698,Programming Languages,Graduate,F2F,CB2-122,YES
19745,MSB-123
36598,PSY-100
20315,HSA1-116

Beachte: Wenn ein Kurs Labs hat, folgen nach der Hauptzeile mehrere Zeilen mit den Lab-CRNs und deren Räumen. Wenn der Modus Online ist, enthält die Zeile nur CRN, Kursnummer, Titel, Niveau und Online – ohne Raum und Lab-Information.

Schritt-für-Schritt-Anleitung

1. Datei einlesen mit BufferedReader

Verwende BufferedReader und FileReader, um die Datei zeilenweise zu lesen. So geht's:

BufferedReader reader = new BufferedReader(new FileReader("lec.txt"));
String line;
while ((line = reader.readLine()) != null) {
    // Verarbeite die Zeile
}
reader.close();

2. Zeilen parsen

Jede Zeile wird durch Kommas getrennt. Verwende line.split(","), um die Felder zu extrahieren. Die Anzahl der Felder variiert:

  • Hauptzeile eines Kurses: 7 Felder (CRN, Kursnummer, Titel, Niveau, Modus, Raum, Lab-Info)
  • Lab-Zeile: 2 Felder (CRN, Raum)
  • Online-Kurs: 5 Felder (CRN, Kursnummer, Titel, Niveau, Online)

Ein Beispiel für das Parsen:

String[] parts = line.split(",");
if (parts.length == 7) {
    String crn = parts[0];
    String courseNum = parts[1];
    String title = parts[2];
    String level = parts[3];
    String modality = parts[4];
    String room = parts[5];
    String labInfo = parts[6];
} else if (parts.length == 2) {
    // Lab-Zeile
    String labCrn = parts[0];
    String labRoom = parts[1];
} else if (parts.length == 5) {
    // Online-Kurs
    String crn = parts[0];
    String courseNum = parts[1];
    String title = parts[2];
    String level = parts[3];
    // modality ist "Online"
}

3. Daten strukturieren

Speichere die Informationen in geeigneten Datenstrukturen, z.B. einer Liste für Online-Kurse und einer Map von Räumen zu CRNs. Hier ein Vorschlag:

List<String> onlineCrns = new ArrayList<>();
Map<String, List<String>> roomToCrns = new HashMap<>();
List<String> noLabLectures = new ArrayList<>(); // für lecturesOnly.txt

4. Online-Kurse zählen

Wenn der Modus "Online" ist, erhöhe einen Zähler. Beachte, dass Online-Kurse keine Lab-Information haben.

5. Räume zuordnen

Für jede Zeile mit einem Raum (sowohl Hauptzeilen als auch Lab-Zeilen) füge die CRN zur entsprechenden Raum-Liste hinzu. So kannst du später auf Benutzereingabe reagieren.

6. Ausgabedatei schreiben

Verwende BufferedWriter und FileWriter, um die Datei lecturesOnly.txt zu erstellen. Schreibe zuerst die Überschrift "Online Lectures" und dann die Zeilen der Online-Kurse. Danach "Lectures with No Lab" und die Zeilen der Kurse ohne Lab.

BufferedWriter writer = new BufferedWriter(new FileWriter("lecturesOnly.txt"));
writer.write("Online Lectures");
writer.newLine();
for (String line : onlineLines) {
    writer.write(line);
    writer.newLine();
}
writer.write("Lectures with No Lab");
writer.newLine();
for (String line : noLabLines) {
    writer.write(line);
    writer.newLine();
}
writer.close();

Vollständiges Beispiel

Hier ist ein zusammenhängendes Codebeispiel, das die Schritte umsetzt:

import java.io.*;
import java.util.*;

public class CourseProcessor {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("lec.txt"));
        String line;
        int onlineCount = 0;
        Map<String, List<String>> roomToCrns = new HashMap<>();
        List<String> onlineLines = new ArrayList<>();
        List<String> noLabLines = new ArrayList<>();
        List<String> allLines = new ArrayList<>(); // zum späteren Schreiben

        while ((line = reader.readLine()) != null) {
            allLines.add(line);
            String[] parts = line.split(",");
            if (parts.length == 7) {
                // Normaler Kurs
                String room = parts[5];
                String labInfo = parts[6];
                roomToCrns.computeIfAbsent(room, k -> new ArrayList<>()).add(parts[0]);
                if (labInfo.equalsIgnoreCase("No")) {
                    noLabLines.add(line);
                }
            } else if (parts.length == 2) {
                // Lab-Zeile
                String room = parts[1];
                roomToCrns.computeIfAbsent(room, k -> new ArrayList<>()).add(parts[0]);
            } else if (parts.length == 5) {
                // Online-Kurs
                onlineCount++;
                onlineLines.add(line);
            }
        }
        reader.close();

        // Benutzereingabe
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter the classroom: ");
        String inputRoom = scanner.nextLine();
        scanner.close();

        // Ausgabe
        System.out.println("There are " + onlineCount + " online lectures offered");
        List<String> crnsInRoom = roomToCrns.get(inputRoom);
        if (crnsInRoom != null) {
            System.out.print("The crns held in " + inputRoom + " are: ");
            for (String crn : crnsInRoom) {
                System.out.print(crn + " ");
            }
            System.out.println();
        } else {
            System.out.println("No courses found in " + inputRoom);
        }

        // Datei schreiben
        BufferedWriter writer = new BufferedWriter(new FileWriter("lecturesOnly.txt"));
        writer.write("Online Lectures");
        writer.newLine();
        for (String ol : onlineLines) {
            writer.write(ol);
            writer.newLine();
        }
        writer.write("Lectures with No Lab");
        writer.newLine();
        for (String nl : noLabLines) {
            writer.write(nl);
            writer.newLine();
        }
        writer.close();
        System.out.println("lecturesOnly.txt is created");
        System.out.println("Goodbye!");
    }
}

Häufige Fehler und Tipps

  • Vergiss nicht, die Dateien zu schließen: Immer close() aufrufen oder try-with-resources verwenden.
  • Achte auf die Zeilenanzahl: Online-Kurse haben nur 5 Teile, normale Kurse 7, Labs 2. Überprüfe die Länge des Arrays.
  • Groß-/Kleinschreibung: "Online" vs. "online" – verwende equalsIgnoreCase().
  • Dateipfad: Stelle sicher, dass die Datei lec.txt im richtigen Verzeichnis liegt (z.B. im Projektordner).

Erweiterungen und Praxisbezug

Dieses Grundgerüst lässt sich leicht anpassen. Du könntest zum Beispiel eine Benutzeroberfläche hinzufügen oder die Daten in einer Datenbank speichern. In der heutigen Zeit, in der viele Universitäten auf Online-Lehre umstellen, ist die Verarbeitung solcher Daten hochaktuell. Stell dir vor, du entwickelst ein Tool, das automatisch den Stundenplan für Studierende erstellt – genau solche Fähigkeiten lernst du hier.

Fazit

Datei-I/O in Java ist eine essenzielle Technik. Mit diesem Tutorial hast du gelernt, wie man Textdateien liest, parst und neue Dateien erstellt. Übe mit eigenen Daten und erweitere das Programm, um noch mehr Funktionalitäten wie Fehlerbehandlung oder das Verarbeiten von Binärdateien zu integrieren. Viel Erfolg bei deiner Aufgabe!