Ist das ein gutes Programm für String Suche in einer Datei (Java)?
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class StringSearchInFile {
public static void main(String[] args) {
String filePath = "text.txt"; // Pfad zur Textdatei
String searchString = "gesuchterString"; // Der zu suchende String
try {
FileInputStream fis = new FileInputStream(filePath);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line;
int lineNumber = 1;
boolean found = false;
while ((line = br.readLine()) != null) {
if (line.contains(searchString)) {
System.out.println("String gefunden in Zeile " + lineNumber + ": " + line);
found = true;
break; // Abbruch nach dem ersten Fund
}
lineNumber++;
}
if (!found) {
System.out.println("String nicht gefunden.");
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Als Lösung für ein Übungsbeispiel. Es soll das erste Vorkommen eines Text in einer Datei gefunden werden.
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.
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.