Ist das ein gutes Programm für String Suche in einer Datei (Java)?

3 Antworten

Funktionieren wird's. Es ist aber ziemlich umständlich. Der Code sieht aus, wie man das vor ca. 20 Jahren gelöst hätte. Schau dir die Klasse Files an, lies dich in try-with-resources ein, schau dir Streams an.

Das hier ist jedenfalls sinnlos und eine (leider verbreitete) Unart:

        } catch (IOException e) {
            e.printStackTrace();
        }

Wenn ich wirklich nicht weiß, was ich mit einer Exception tun soll, dann lasse ich sie einfach rauspropagieren - dann kann sich der Aufrufer darum kümmern, und zumindest merkt er so, dass etwas schiefgelaufen ist.

Von Experte jo135 bestätigt

Ich finde die Variante mit einem Scanner statt diesen ganzen Readern und Buffern und Streams übersichtlicher.

Falls die Zeilennummer nicht wichtig ist, z.B. so:

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

public class StringSearchInFile {
    public static void main(String[] args) throws IOException {
        String filePath = "text.txt"; // Pfad zur Textdatei
        String searchString = "gesuchterString"; // Der zu suchende String

        try (Scanner scanner = new Scanner(new File(filePath))) {
            scanner.findAll(Pattern.quote(searchString)).findFirst().ifPresentOrElse(
                match -> System.out.println("String gefunden an Position " + match.start()), 
                () -> System.out.println("String nicht gefunden.")
            );
        };
    }
}

oder falls unbedingt die Zeilennummer dabei stehen soll, dann das etwas unschönere Beispiel:

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

public class StringSearchInFile {
    public static void main(String[] args) throws IOException {
        String filePath = "text.txt"; // Pfad zur Textdatei
        String searchString = "gesuchterString"; // Der zu suchende String

        try (Scanner scanner = new Scanner(new File(filePath))) {
            int lineNr = 0;
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                ++lineNr;
                if (line.contains(searchString)) {
                    System.out.printf("String gefunden in Zeile %d: \"%s\".%n", lineNr, line);
                    return;
                }
            }
            System.out.println("String nicht gefunden.");
        };
    }
}

Allerdings schätze ich mal, dass dein Beispiel auch funktionieren müsste, daher kannst du es natürlich auch benutzen. Mir hat damals bloß immer der Kopf geraucht, wenn man z.B. für einen einfacher Userinput diese komplizierte Variante mit Readern und Buffern und Streams machen musste, anstatt einfach Scanner(System.in) benutzen zu können. Das Gleiche gilt auch für Textdateien. Der Scanner kann so ziemlich alles lesen, was du ihm hinwirfst.

Das sieht so aus. Allerdings ist das ein veralteter Ansatz. Heute macht man sowas mit FileReader / Scanner.