String einlesen, in .txt durchsuchen und Ergebnisse ausgeben

houlyy

Mitglied
Hallo zusammen,

ich wollte gern ein kleines app mit GUI schreiben.
Im Textfeld wird eine 7-stellige Nummer eingegeben und es soll gesucht werden, ob diese sich in der Textdatei befindet. Es wäre günstig wenn er danach:

a) anzeigt das die Nummer vorhanden ist ODER
b) wenn er die ganze Zeile aus der Textdatei ausgibt in einer Textarea

Leider habe ich noch nicht soviel programmiert, aber hab mal angefangen etwas. Es fehlt aber glaube auch noch eine Schleife, denn er zeigt in der Textarea bisher nur einmal was an.

Mein Code bisher:

Java:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
        try {
		BufferedReader in = new BufferedReader(new FileReader("C:\\archiv.txt"));
		String zeile;
		while ((zeile = in.readLine()) != null) {
                    {
                       zeile = in.readLine();
                       if(eingabe.equals(zeile)){
                           jTextArea1.setText(zeile);
                           //jTextArea1.setText("Eintrag gefunden");
                        }else{
                        }
                        jTextArea1.setText("Kein Eintrag gefunden");
                    }
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
    }

cpq6vt8z.jpg
 

XPrototypeX

Aktives Mitglied
Der Anfang ist gar nicht so schlecht.

Hättest du dir aber die API Doku von readLine() angeschaut wüsstest du, dass du den Aufruf nur einmal pro Durchgang machen musst.

Java:
  try {
        BufferedReader in = new BufferedReader(new FileReader("C:\\archiv.txt"));
        String zeile;
String code= txtFieldCode.getText();
        while ((zeile = in.readLine()) != null) {
                    {
                 
                       if(zeile.equals(code)){
                           jTextArea1.setText(zeile);
                           //jTextArea1.setText("Eintrag gefunden");
                        }else{
                        }
                        jTextArea1.setText("Kein Eintrag gefunden");
                    }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Nach meiner Sicht ist an der Stelle auch eine Datenbank in betracht zu ziehen.
 

houlyy

Mitglied
Hallo,

danke für die Antwort.
Leider funktioniert es dennoch nicht. Egal welche Zeile ich suche, er gibt nur aus "Kein Eintrag gefunden". Und was ich jetzt noch nicht ganz verstanden habe...wie mache ich es, dass ich unedlich oft weitersuchen kann, ohne das Programm neuzustarten?

Edit: Also die erneute Suche geht glaube ich. Man merkt es nur nicht, da er immer wieder "Kein Eintrag gefunden" anzeigt.

Was fehlt noch, damit der die .txt richtig durchsucht und ausgibt :roll:

Viele Grüße
 
Zuletzt bearbeitet:

XPrototypeX

Aktives Mitglied
Naja ein bisschen Überlegen sollst du schon noch.
Java:
 jTextArea1.setText("Kein Eintrag gefunden");

Muss in das else{}
Sonst schreibt er das immer auch wenn die Bedingung true ist.
Deine andere Frage verstehe ich nicht. Du rufst die Methode doch auf Button Click auf oder? Die wird immer ausgeführt, wenn du auf den Button klickst. Das textField hat ein OnChange Event. Das heißt immer wenn der Text geändert wird, wird diese Methode aufgerufen. Aber da kannst du ruhig mal google Fragen. Wird bestimmt schon 100000 mal beantwortet.
 

houlyy

Mitglied
Sorry, das hab ich total übersehen das die Zeile außerhalb des else ist...
Es wird aber dennoch immer nur die letzte Zeile in der Textdatei gefunden und als "Eintrag gefunden" angezeigt. Ist es möglich das er alle Zeilen überprüft?

Die letzte Frage hatte sich eigentlich erübrigt.
 
Zuletzt bearbeitet:

XPrototypeX

Aktives Mitglied
Java:
                       if(zeile.equals(code)){

Das impliziert, dass zeile == code sein muss.

Wenn eine Zeile aber aus z.B" Code - irgendein Text" besteht, liefert equals false.

Die Methode die du suchst heißt contains().

Edit: Schließe den Reader mit close() am ende der Methode.
 
Zuletzt bearbeitet:

houlyy

Mitglied
Langsam rafft es mein Kopf ;) Ich hab natürlich nur genau das verglichen was ich im Textfeld eingebe und nicht den Teil einer ganzen Zeichenkette. Trotzdem bin ich zu blöd, dass er alle Zeilen durchsucht :( Nur bei der letzten Zeile gibt er true zurück. Bei anderen aus der Textdatei nicht.

Muss ich den BufferedReader UND den FileReader schließen? Und schließt man den dann im try Block?
 
Zuletzt bearbeitet:

XPrototypeX

Aktives Mitglied
Eigentlich sollte man so etwas schreiben:

Java:
	try {
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			//Close all streams 
		}

Ich verstehe jedoch nicht ganz was nicht funktioniert? Kannst du nochmal dein Code posten und einen Auszug aus deiner .txt Datei und Angeben was er findet und was nicht?
 

houlyy

Mitglied
Java:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
        try {
		BufferedReader in = new BufferedReader(new FileReader("C:\\archiv.txt"));
		String zeile;
                String code = jTextField1.getText();
            if(jTextField1.getText().length() == 0){
                jTextArea1.setText("Keine Nummer eingegeben");
            }
            else{
                while ((zeile = in.readLine()) != null) {
                    {
                       if(zeile.contains(code)){
                           jTextArea1.setText(zeile);
                           jTextArea1.setText("Eintrag" + " " +code+ " " + "gefunden");
                        }else{
                           jTextArea1.setText("Kein Eintrag gefunden");
                        }  
                    }
		 }

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

In der Textdatei sind ein paar Zahlenkombinationen drinne:

Code:
123456
3242423
323
4242424
231324

Suche ich im Programm nach 123456, dann sagt er kein Eintrag gefunden.
Wenn man aber nach 231324 (letzter Eintrag) in der Textdatei sucht, dann findet er diese und sagt "Eintrag gefunden".
 

MiMij

Bekanntes Mitglied
Mach dir vor dem If ein system.out.println von Zeile, lass dir anzeigen was genau er gerade für eine Zeile bearbeitet.
Dann in dem If und in dem else auch ein println mit den jeweils interessanten Werten. Dann siehst du genau was er macht und wo es falsch läuft.
 

XPrototypeX

Aktives Mitglied
@MiMij sowas kann man relativ gut auch im Debugger sehen.

Aber back to topic

Java ist eine objektorientierte Sprache. Verwende sie auch so.

Java:
public class CodeControll {

	private Set<String> codes;

	public CodeControll(File file) throws IOException {
		//ließt das angegebene File in ein Hashset Line by Line
		codes = new HashSet<String>(Files.readAllLines(file.toPath(), Charset.defaultCharset()));
	}

	
	/**
	 * returnt true wenn der gegebene Code in dem Set vorhanden ist
	 * @param code
	 * @return
	 */
	public boolean hasCode(String code) {
		return codes.contains(code);
	}

	/**
	 * returnt true wenn der gegebene Code in einem String vom Set enthalten ist
	 */
	
	public boolean containsCode(String code) {
		for (String currCode : codes) {
			if (currCode.contains(code)) {
				return true;
			}
		}
		return false;
	}

}

So würde ich das ganze ungefähr machen. Deine View (Gui Klasse" ruft einfach nur containsCode mit dem entsprechendem Parameter auf und die Sache hat sich. Am Anfang wird das komplette File in ein Set geladen. Das hat den Vorteil es ist im Speicher vorhanden, schnelle Zugriffzeiten und man muss nicht ständig ein neues Streamobjekt erstellen. Schreibzugriffe werden so allerdings schwierig.
 

houlyy

Mitglied
Danke für die Hilfe!
Schreibzugriffe auf die Textfile sind nicht notwenig.

Jetzt hab ich aber durch die Änderung schon wieder 0 Peilung was in der View geändert werden muss. Könntest du mir dort noch behilflich sein?
 

MiMij

Bekanntes Mitglied
@MiMij sowas kann man relativ gut auch im Debugger sehen.

Das ist mir klar, aber viele Anfänger und auch einige Fortgeschrittene, haben Probleme mit dem Debugger, wie man ihn nutzen muss, deswegen empfehle ich meist das println.




@houlyy
Hast du das mal probiert mit den Ausgaben? Versteh erstmal deinen Code bevor du von anderen einfach was kopierst.
 

houlyy

Mitglied
Ich hab bisher alles verstanden was geändert wurde, aber jetzt nicht mehr so richtig.

In der CodeControll Klasse verstehe ich z.B. nicht wo definiert ist, dass er die .txt als HashSet String einliest??
 

MiMij

Bekanntes Mitglied
Du hast deinen Code nicht verstanden, warum er nur die letzte Zeile findet. Deswegen hatte ich dir als TIpp gegeben mal ein paar Sytem.out.println einzufügen um zu sehen was genau konotrolliert wird.
 

XPrototypeX

Aktives Mitglied
Seit Java 7 gibt es die Utility Klasse Files. Die bietet eine Methode an

readAllLines(Path path, Charset charset);

Diese lädt Zeile für Zeile in eine ArrayList. Aus Faulheit füge ich den Inhalt der List einem Set hinzu um besser auf die Elemente zugreiffen zu können. Außerdem ist ein Set bei vielen Elementen schneller (im Sinn von suchen & finde) wobei das bei deinem Szenario wahrscheinlich irrelevant ist.

Java:
  codes = new HashSet<String>(Files.readAllLines(file.toPath(), Charset.defaultCharset()));
 
Zuletzt bearbeitet:

houlyy

Mitglied
Die einzelnen Codeausschnitte habe ich im groben schon verstanden.
Wird die Methode containsCode jetzt einfach nur durch den String Zeile aus der View ersetzt oder wird der ganze BufferedReader ersetzt?

Komme dort noch nicht ganz klar, wie die neue Klasse in der View zum Einsatz kommt.
 

XPrototypeX

Aktives Mitglied
Um, schau dir mal ein Tut an zu Java und OOP.

Java:
private CodeControll codeControll = new CodeControll(new File("somePAth")); //erstellt eine neues Objekt der Klasse CodeControll



//später im Code

if(codeControll.containsCode(txtView.getText())){
//do something
}else{
//do something else
}
 

houlyy

Mitglied
Das ist zwar echt peinlich, aber ich hatte das alles schon^^
Hab Inofmratik Master und genug OOP, nur hab ich danach nie wieder programmiert oder es gebraucht...wenn man nicht täglich/wöchentlich mal was macht, vergisst man das ganz schnell.

Da geht schon los, wenn man wieder überlegt wie man eine Methode einer anderen Klasse aufruft. Eine Instanz der Klasse anzulegen war für mein Kopf schon wieder zuviel wohl :p
 

houlyy

Mitglied
Ich hab noch ein Problem festgestellt.
Wenn in der Textdatei zuviele Einträge sind gibt er nix aus. Es kommt folgender Fehler:

Code:
java.nio.charset.MalformedInputException: Input length = 1

So wie ich das mitbekommen hab, kommt der Fehler durch einen illegalen Character.
Kann man das umgehen?
 

XPrototypeX

Aktives Mitglied
Was heißt zu viele Einträge? Schau mal die Methode readAllLines hat einen Parameter names Charset. Dort kannst du versuchen einen anderen Anzugeben. Momentan nimmt er den default charset. Keine Ahnung was das bei Windows ist. Versuche einfach mal UTF-8 oder so.
 

houlyy

Mitglied
Hab verschiedene ausprobiert, aber entweder kommt eine Exception oder er hängt ewig und sucht. Bei einer Textdatei mit 10 Zeilen geht es ohne Probleme, aber bei einer Textdatei mit 85.000 Zeilen mit einer Größe von fast 5MB geht es leider nicht.
 

dehlen

Bekanntes Mitglied
Er gibt dir auch immer nur Eintrag gefunden aus wenn der Eintrag der letzte war, weil du dein JTextField Inhalt immer überschreibst. Anstatt
Java:
textField.setText("");
schreib doch mal
Java:
textField.setText(textField.getText()+"");

Zum zweiten blockiert er natürlich bei so vielen Zeilen. Mach das Laden/durchsuchen doch asynchron und lager das ganze in eine Worker Thread im Background aus, denn ansonsten ist deine ganze GUI blockiert bis zum Ende des Suchprozesses.

BTW, welche Exception kommt ?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R String einlesen, Textdatei danach durchsuchen und aus Zeile Objekt erzeugen Java Basics - Anfänger-Themen 5
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
K String einlesen und als Variable speichern Java Basics - Anfänger-Themen 8
T Input/Output Double und String als Eingabe einlesen Java Basics - Anfänger-Themen 9
J scanner, String einlesen und vergleichen Java Basics - Anfänger-Themen 3
K Input/Output 6000 Zeilen einlesen und String-Array vergleichen? Java Basics - Anfänger-Themen 1
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
A Webseite einlesen und mit String vergleichen Java Basics - Anfänger-Themen 7
D txt-Datei zeilenweise als String einlesen Java Basics - Anfänger-Themen 2
R String Delimiter (Split) einlesen Java Basics - Anfänger-Themen 9
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
I .csv-Datei einlesen klappt aber kann nicht in String geschrieben werden!?!?! Java Basics - Anfänger-Themen 11
B Einlesen String Java Basics - Anfänger-Themen 5
M .txt datei "einlesen" und in String speichern! Java Basics - Anfänger-Themen 15
max56 String einlesen Java Basics - Anfänger-Themen 44
B Textdatei als String einlesen Java Basics - Anfänger-Themen 3
S String einlesen Java Basics - Anfänger-Themen 2
G String zeilenweise einlesen Java Basics - Anfänger-Themen 2
O String in array einlesen alle x zeichen Java Basics - Anfänger-Themen 15
W String in ein String-Array einlesen ? Java Basics - Anfänger-Themen 2
A String einlesen 1 Buchstabe fehlt Java Basics - Anfänger-Themen 2
M String einlesen und zerteilen Java Basics - Anfänger-Themen 3
Z Datei einlesen in ein String und weiter verwenden Java Basics - Anfänger-Themen 3
H text string alle 100 zeichen in ein 1D array einlesen ? Java Basics - Anfänger-Themen 8
J Java Aufgabe -> String einlesen, splitten,Substring & Java Basics - Anfänger-Themen 3
G Integerzahlen aus String einlesen Java Basics - Anfänger-Themen 2
I String mit Leerzeichen einlesen Java Basics - Anfänger-Themen 3
B string als komandozeilenparameter einlesen ? Java Basics - Anfänger-Themen 3
G String mit next()-Methode einlesen - keine Leerzeichen! Java Basics - Anfänger-Themen 11
C Frage zu: String einlesen -> Array von Chars erhalten Java Basics - Anfänger-Themen 4
M Textfield String einlesen und an socketclient verschicken Java Basics - Anfänger-Themen 12
G String einlesen..... Java Basics - Anfänger-Themen 4
L koordinatenpaare als string einlesen Java Basics - Anfänger-Themen 3
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 3
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben