

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.